sql server鎖表
專案執行過程提示了死鎖,一個select查詢和一個update的更新居然出現了死鎖,本身select會有共享鎖,update會有排它鎖,但是我的兩個語句目前應該不符合那種特殊情況(特殊情況會導致select和update死鎖)
於是做了實:
1)編寫一個一直執行的select
while 1=1
begin
select balance from bo_account_wallet where accountsubid=10046
end
2)查詢當前是否有鎖表的情況
select
request_session_id spid,
OBJECT_NAME(resource_associated_entity_id) tableName
from
sys.dm_tran_locks
where
resource_type='OBJECT'
此時並無鎖表,難道有錯??
於是用update做了確定:
同樣的操作:
1)編寫一個更新語句
while 1=1
begin
update bo_account_wallet set islock=1 where accountsubid=10046
end
2)查詢鎖表情況
select
request_session_id spid,
OBJECT_NAME(resource_associated_entity_id) tableName
from
sys.dm_tran_locks
where
resource_type='OBJECT'
此時會有鎖表的spid
3)查詢當前的鎖型別
EXEC sp_who active
exec sp_lock
說明這種實驗是可以驗證的;後來找到原因了,我的程式碼中查詢是通過儲存過程的,所以將實驗修改為:
while 1=1
begin
exec EncryptAndDecrypt 'cetIBS20201012Pa$$word','
select balance from bo_account_wallet with(nolock) where accountsubid=10046'
end
此時看到鎖表資訊了,這說明儲存過程會有加鎖的情況