如果有一個表約幾個用戶數寄存器,例如,像這樣:使用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
表只是爲了在事務中用一些虛擬數據更新用戶記錄以獲得相同的效果,但它聽起來並不正確。