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
此时看到锁表信息了,这说明存储过程会有加锁的情况