查看表锁类型
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. 待续。。。。。