博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

sql server锁表

Posted on 2021-12-15 19:42  一只菜鸟的进阶之路  阅读(810)  评论(0编辑  收藏  举报

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

 

此时看到锁表信息了,这说明存储过程会有加锁的情况