日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

.net core 下的分布式事务锁

發(fā)布時(shí)間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .net core 下的分布式事务锁 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

系統(tǒng)分布式鎖的用法

公司框架新增功能分布式鎖:

鎖的性能之王:緩存 > Zookeeper >= 數(shù)據(jù)庫(kù)

鎖的實(shí)現(xiàn)

實(shí)現(xiàn)原理:核心采用StackExchange.Redis的LockTake方法實(shí)現(xiàn)。
支持同步獲取鎖,或者等待直到超時(shí)獲取鎖。

/// <summary>/// 分布式鎖,提供全局分布式鎖支持,以resource redis為基礎(chǔ)/// 這個(gè)鎖只能通過(guò)RpcContext來(lái)獲取,通過(guò)自己手動(dòng)釋放/// </summary>public sealed class DistributedLock{private static readonly TimeSpan DefaultAbandonmentCheckFrequency = TimeSpan.FromSeconds(2);public readonly string lockName;private readonly string lockValue;private readonly int checkTimeSpan = 50; //msprivate readonly int autoDelete;private DistributedLock(){}/// <summary>/// /// </summary>/// <param name="lockName"></param>/// <param name="autoDelete">自動(dòng)刪除,ms,默認(rèn) 60s</param>/// <param name="checkTimeSpan">如果不能獲取鎖,重復(fù)檢查間隔:默認(rèn) 50ms</param>internal DistributedLock(string lockName, int autoDelete = 60000,int checkTimeSpan = 50){// note that just Global\ is not a valid nameif (string.IsNullOrEmpty(lockName))throw new ArgumentNullException("lockName不能為空");if (null == ResourceCache.Instance)throw new Exception(@"ResourceCache 沒(méi)有配置或無(wú)法連接");this.checkTimeSpan = Math.Max(checkTimeSpan,1);this.autoDelete = Math.Max(autoDelete,1);this.lockName = lockName;this.lockValue = lockName;}/// <summary>/// 獲取鎖/// </summary>/// <param name="timeout">超時(shí)為null,則嘗試一次即返回</param>/// <returns>獲取鎖成功?</returns>internal bool Acquire(TimeSpan? timeout = null){bool bLock = false;var dtStart = DateTime.Now.Ticks;while (!bLock){bLock = TryAcquireOnce();if (timeout == null){break;}if (!bLock){Thread.Sleep(this.checkTimeSpan);}var ts = new TimeSpan(DateTime.Now.Ticks - dtStart);if (ts >= timeout){break;}}return bLock;}//此處采用框架上下文管理分布式事務(wù)鎖的釋放,代碼略。//public void Dispose()//{// LockManager.ReleaseLock(this);//}internal void Release(){try{var bRtn = ResourceCache.Instance.LockRelease(this.lockName, this.lockValue);Trace.WriteLine($"釋放鎖 {this.lockName}:{bRtn}");}catch (Exception e){LogTextWriter.Write($"釋放鎖失敗,系統(tǒng)自動(dòng)超時(shí)釋放:{this.lockName}");}}/// <summary>/// 釋放鎖/// </summary>public void ReleaseLock(){LockManager.ReleaseLock(this);}private bool TryAcquireOnce(){try{Trace.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:TryAcquireOnce");var @lock = ResourceCache.Instance.LockTake(this.lockName, this.lockValue, new TimeSpan(0, 0, 0, 0, this.autoDelete));return @lock;}catch (Exception e){return false;}}}

鎖的使用

在當(dāng)前上下文中獲取一個(gè)分布式鎖,第一個(gè)獲取鎖的將執(zhí)行依賴當(dāng)前key(一般為業(yè)務(wù)主鍵)的完整業(yè)務(wù)流程(包括多個(gè)微服務(wù)之間的調(diào)用和數(shù)據(jù)庫(kù)的訪問(wèn);

后來(lái)者將無(wú)法獲取鎖,根據(jù)返回的結(jié)果來(lái)判斷是否進(jìn)入流程,如果返回的鎖為null將不能執(zhí)行下面的流程,要么重試等待鎖釋放,要么返回錯(cuò)誤.

鎖的調(diào)用一般流程:

var qtLock=TryGetLock(lockKey);if(qtLock==null) { //提示不能同時(shí)執(zhí)行操作return;}else {//進(jìn)行業(yè)務(wù)流程}//最后別忘了qtLock.ReleaseLock();

API 內(nèi)的范例:

code = StatusCode.OK;//傳入超時(shí)時(shí)間,可以一直等待到超時(shí)過(guò)期var lockSaveReceipt = this.Context.TryGetLock($"{nameof(SaveReceipt)}.{valueArgs.ReceiptArgs.ReceiptId}");if (lockSaveReceipt == null){code = PublicErrorCode.SaveReceiptByUsed.ToCode();return null;}try{//todo 業(yè)務(wù)操作1//todo 業(yè)務(wù)操作2//...}finally{lockSaveReceipt.ReleaseLock();}

總結(jié)

以上是生活随笔為你收集整理的.net core 下的分布式事务锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。