前言:
在系統中多少會遇到某些交易間需要互斥(不然容易造成DeadLock
).
在我們當前系統中有許多動作間需要互斥,不然會有DeadLock問題
藉由已經分析DeadLock Report後,我開始構思如何讓建立Lock可以變得更容易且好理解.
所以就建構出此Lock架構.
如何在此框架使用Lock機制
我們只需要做幾個步驟:
- 在使用Lock類別上掛
LockerInterceptor
攔截器標籤. - 使用Lock方法上使用
LockAttribute
標籤[Lock(LockKey = "Your lock Key")]
(Key
屬性是必填的) - 設定Lock屬性.
目前寫法是針對單一Server Mutiple Thread來建立互斥Lock. 假如有遇到多台Servers需要建立互斥模式可以,參考Redis的
Redlock.Net
.
使用方法如下,這樣在多執行緒系統中MethodA1
跟MethodB_A
就不會有同時執行問題,這樣就可以造成這兩個動作互斥.
1 | [ ] |
架構解說
我是使用ReaderWriterLockSlim
因為支援ReadLock不互斥,WriteLock互斥邏輯
我是如何讓使用者輸入Key
來建立不同lock呢?
我是使用ConcurrentDictionary來處理此問題,每個
Key
都有不同Lock
物件
LockAttribute
LockAttribute
有幾個屬性.
Key
:鎖名稱Mode
:鎖的模式LockMode.XLock
:獨占鎖會排斥其他資源請求此鎖,須等待資源釋放.LockMode.Shared
:Shared lock之間不互斥.
Order
:因為支援多個LockAttribute
,此屬性決定執行此方法前要求鎖順序
1 | [ ] |
LockerInterceptor
我們直接來IInterceptor
物件最核心邏輯方法Intercept(IInvocation invocation)
.
利用GetCustomAttributes
取得方法上所有LockAttribute
並在方法執行前要求拿到,所需要Lock
資源才可以執行方法,最後在finally
時釋放lock資源
1 | public void Intercept(IInvocation invocation) |
SampleCode
我利用Nunit寫一個簡單程式Print在console讓我們方便觀看結果.
MethodA
:Shared lock mode on key AMethodA1
:X lock mode on key AMethodB_A
:X lock mode on key A and BMethodB
:X lock mode on key B
理論上MethodB
只會對於MethodB_A
互斥,MethodB
並不會跟MethodA
,MethodA1
有互斥反應.
1 | [ ] |
Result
我們發現MethodB_A
這個方法會對於,所有key是A
,B
方法互斥,MethodA
則不會對於MethodA
,MethodB
互斥.
1 | 14:26:59 815 MethodA1 Done |
小結
本篇主要想要介紹使用Lock機制.
利用ReaderWriterLockSlim就可以建立如DB lock,實在非常方便.
假如想要細部了解Autofac + Interceptors(AOP) 動態代理可以參考我之前寫文章,這裡我就不多敘述了.
SourceCode LockService
此文作者:Daniel Shih(石頭)
此文地址: https://isdaniel.github.io/aop-lock-mechanism/
版權聲明:本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 3.0 TW 許可協議。轉載請註明出處!