2016-11-15 41 views
0

如果有一個表約幾個用戶數寄存器,例如,像這樣:使用sp_getapplock可以鎖定數據資源嗎?

create table test (id int identity, userid int, data nvarchar(max)); 

insert into test (userid, data) 
      select 1, 'aaa' 
union all select 1, 'bbb' 
union all select 2, 'ccc' 
union all select 3, 'ddd' 
union all select 3, 'eee'; 

並多次進程中運行以下更新:

update test 
set data = data + 'z' 
where userid = 1; 

根據更新的執行計劃查詢有可能一個更新開始在方向上更新,而另一個更新將導致死鎖。

爲了防止出現這種情況,不鎖定整個表格,也許可以使用sp_getapplock並鎖定資源'userid_1'。這樣,只有一個進程可以更新每個用戶,但是多個進程仍然可以並行更新其他用戶(sp_getapplock'userid_3'等)。

begin transaction 

sp_getapplock @Resource = 'userid_1', @LockMode = 'Exclusive'; 

update test 
set data = data + 'z' 
where userid = 1; 

sp_releaseapplock @Resource = 'userid_1'; 

commit transaction 

sp_getapplock能夠喜歡這個工作,對許多用戶?

我問這個,因爲我發現使用sp_getapplock對應用程序資源鎖定像'form_1',也許這可能意味着sp_getapplock的例子並不需要擴展到大量的資源(如100K用戶對不同的用戶10鎖定在每一刻)。

我會測試這個,但想知道我是否做錯了什麼。

注意:我考慮添加一個user表只是爲了在事務中用一些虛擬數據更新用戶記錄以獲得相同的效果,但它聽起來並不正確。

回答

0

這取決於你的意思是「規模好」。你本質上是爲你的數據庫中的一個邏輯實體(在你的例子中是一個用戶)推出自己的互斥鎖。在第一個之後調用獲取互斥體會阻塞,直到互斥體被釋放(或者擁有範圍結束,此時隱式釋放互斥體)。這本質上會降低併發性,但我會爭辯說,這就是你想要做的。但是要回答有關資源使用情況的問題,應用程序鎖使用與用於鎖定表或數據頁的基礎結構相同的基礎結構。唯一的區別是你明確地控制它。

相關問題