sql server 死锁

本文介绍了SQL Server中查看表锁类型及互相阻塞的SQL的方法,并解释了各种锁模式的作用,包括意向排他锁(IX)、意向共享锁(IS)、共享锁(S)、排他锁(X)等。此外,还提供了如何设置会话级别的锁超时时间的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看表锁类型
select object_name(resource_associated_entity_id) LockedTableName,request_mode
from sys.dm_tran_locks
where resource_type='OBJECT'

查看互相阻塞的sql
select a.spid,a.blocked,b.text [sql]
from sys.sysprocesses a
outer apply sys.dm_exec_sql_text(a.sql_handle) b
--where a.blocked>0
where a.spid>50 --ignore system spid
and a.spid <> @@SPID --ignore current spid

53被52阻塞

设置session 的锁超时时间,仅对当前session有效
SET LOCK_TIMEOUT 3000 --毫秒ms
/* 1 s = 1000 ms
*/
select @@LOCK_TIMEOUT --默认值为-1,即无超时限制
超时后等待的那个进程会被kill,并抛出以下错误


request_mode 解释
IX意向排他可以select,insert,不能update,delete
IS意向共享一般select会加此锁,可以update, delete, insert, select
S共享锁只能select, 不能insert,update,delete
X排他锁不能select,update,insert,delete,可以用select .... nolock
SIX意向排他共享 
*排他可理解为独占
*nolock 只能和select一起用,不能和update,delete,insert

测试环境: SQL Server 2014

单表测试,还可以添加主外键测试
1. 保证Product表的数据量足够多,至少能持续到单个测试结束
【Session 1】
begin tran
select * from Product
【Session 2】
insert into Product。。。。
update Product。。。
delete from Product。。。
select top 10 * from Product
执行完【Session 1】的sql后查看锁级别(最上面的sql,不在重复)

然后立刻执行【Session 2】的所有sql,结果都能成功
执行完后记得把【Session 1】commit

2. 待续。。。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值