TEST
項目運行過程提示了死鎖,一個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
此時看到鎖表信息了,這說明存儲過程會有加鎖的情況