sp_getAppLock使用

sp_getAppLock  獲取程序資源鎖,簡單的說就是調用此函數能夠達到咱們程序中.NET的lock鎖的做用.sql

做用域是當前數據庫下
四個參數:
@resource(必填):資源名稱,類型nvarchar(255),必填,不區分大小寫,若是超出255,則取前255個字符,做用域是當前數據庫下.
@lockMode(必填):鎖的模式,類型nvarchar(32),必填,五個值供選擇:
  Shared: 共享, 至關於鎖裏面的S,
  Update: 更新, 至關於鎖裏面的U
  IntentShared: 意向共享, 至關於鎖裏面的IS
  IntentExclusive: 意向更新, 至關於鎖裏面的IX
  Exclusive: 獨佔, 至關於鎖裏面的X, 其中咱們常常使用的是Exclusive,表示獨佔上面這個@resource資源
@lockOwner:鎖的擁有者,2個值供參考:
  1. Transaction:默認值,若是使用這個,則必須顯示聲明事務,事務結束之後釋放鎖
  2. Session:會話, 會話結束之後釋放鎖
@lockTimeout:鎖的超時時間
@DBPrincipal:數據庫角色數據庫

咱們通常都是使用@LockMode=Exclusive,@LoackMode=Transaction這種方式,因此下面是這種方式的測試.服務器

 

 --不顯示聲明事務的前提下使用sp_getApplock
DECLARE @v int; EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive' SELECT 1,GETDATE(); WAITFOR DELAY '00:00:03'; SELECT 1,GETDATE(); /* 如下SQL顯示的時間內容能夠看出,會話1和會話2仍是並行的 <<會話1>> 您試圖在沒有活動事務的狀況下獲取事務性應用程序鎖。 ----------- ----------------------- 1 2017-08-30 10:22:17.883 ----------- ----------------------- 1 2017-08-30 10:22:20.887 <<會話2>> 您試圖在沒有活動事務的狀況下獲取事務性應用程序鎖。 ----------- ----------------------- 1 2017-08-30 10:22:18.417 ----------- ----------------------- 1 2017-08-30 10:22:21.417 */

 

 

--顯示聲明事務狀況下,調用sp_getAppLock

BEGIN TRAN
DECLARE @v int;
EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive'
SELECT 1,GETDATE();
WAITFOR DELAY '00:00:03';
SELECT 1,GETDATE();
COMMIT
/*
如下SQL顯示的時間內容能夠看出,會話1和會話2是串行執行的

<<會話1>>    
----------- -----------------------
1           2017-08-30 10:29:14.197
 
----------- -----------------------
1           2017-08-30 10:29:17.197


<<會話2>>
----------- -----------------------
1           2017-08-30 10:29:17.200

----------- -----------------------
1           2017-08-30 10:29:20.200

*/

 

當事務結束或者關閉會話或者服務器由於任何緣由關閉的時候都會釋放全部鎖app

 

 

sp_releaseAppLock的做用是釋放鎖,當一個事務中只有部分代碼須要加鎖的時候, 就能夠在執行完業務邏輯後再次調用sp_releaseApplock @Resource='XXX' , 這樣就可讓堵塞的程序繼續執行了. 函數

例如:測試

BEGIN TRAN
DECLARE @v int;
EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive'
WAITFOR DELAY '00:00:03';
SELECT 1,GETDATE();
EXEC sp_releaseapplock @Resource='test'
SELECT 2,GETDATE();
EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive' WAITFOR DELAY '00:00:03'; SELECT 5,GETDATE(); EXEC sp_releaseapplock @Resource='test'
SELECT 6,GETDATE(); COMMIT /* 會話1 ----------- ----------------------- 1 2017-08-30 11:15:23.200 ----------- ----------------------- 2 2017-08-30 11:15:23.200 ----------- ----------------------- 5 2017-08-30 11:15:29.200 ----------- ----------------------- 6 2017-08-30 11:15:29.200 */ BEGIN TRAN DECLARE @v int; EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive' WAITFOR DELAY '00:00:03'; SELECT 3,GETDATE(); EXEC sp_releaseapplock @Resource='test'

SELECT 4,GETDATE();
EXEC @v=sp_getapplock @Resource='test',@LockMode='Exclusive' WAITFOR DELAY '00:00:03'; SELECT 7,GETDATE(); EXEC sp_releaseapplock @Resource='test'

SELECT 8,GETDATE(); COMMIT /* 會話2 ----------- ----------------------- 3 2017-08-30 11:15:26.200 ----------- ----------------------- 4 2017-08-30 11:15:26.200 ----------- ----------------------- 7 2017-08-30 11:15:32.200 ----------- ----------------------- 8 2017-08-30 11:15:32.203
*/

 

 

參考資料:spa

https://msdn.microsoft.com/zh-cn/library/ms189823(v=sql.90).aspxcode

https://msdn.microsoft.com/zh-cn/library/ms178602(v=sql.90).aspxblog

 

 

測試比較簡單,若有不對的地方還請大神指出,謝謝:)事務

相關文章
相關標籤/搜索