要如何確保某段SQL同時間只能有一個Session執行呢?
我們可以使用 sp_getapplock 哦!
今天看到「Prevent multiple users from running the same SQL Server stored procedure at the same time」這篇文章。
他使用「sp_getapplock」來取得鎖定,以確保之後的交易同時間,只能有一個Session執行。
以該文章的範例,開2個視窗(Session)來執行以下的SQL,
DECLARE @RC INT
Begin tran
Exec @RC =sp_getapplock @Resource='MyLock', @LockMode='Exclusive'
, @LockOwner='Transaction', @LockTimeout = 15000
SELECT @@SPID [session_id], @RC [return code], GETDATE()
waitfor delay '00:00:08'
commit
執行結果如下,
回傳值的說明(MSDN)
>= 0 (成功) 或 < 0 (失敗)
0:同步授與鎖定成功。
1:在等待其他不相容的鎖定釋出之後,授與鎖定成功。
-1:鎖定要求逾時。
-2:已取消鎖定要求。
-3:已將鎖定要求選為死結犧牲者。
-999:表示參數驗證或其他呼叫錯誤。
那如果將timeout的時間設成 5 秒,另一個Session的回傳值就會變成 -1 如下,
以這個需求而言,@LockOwner 使用 Transaction 比較適合。
如果 @LockOwner 是使用 Transaction ,則表示如果該交易 commit 或是 rollback ,就會釋放這個鎖定。
如果 @LockOwner 是使用 Session ,則表示要明確呼叫 sp_releaseapplock 或是 Session 關閉連線才會釋放這個鎖定。
詳細請參考「Prevent multiple users from running the same SQL Server stored procedure at the same time」這篇文章。
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^