1. 程式人生 > 其它 >sql server鎖表

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

此時看到鎖表資訊了,這說明儲存過程會有加鎖的情況