/*以此表为例:
SELECT * FROM tb
姓名 课程 分数
---------------------
张三 语文 74
张三 数学 83
李四 语文 74
李四 数学 84
李四 物理 94
*/
--新建第一个会话窗口,执行以下语句:
BEGIN TRAN
UPDATE dbo.tb
SET 分数 = 85
WHERE 姓名 = '张三'
AND 课程 = '语文'
--COMMIT TRAN
--新建第二个会话窗口,执行以下语句:
UPDATE dbo.tb
SET 分数 = 90
WHERE 姓名 = '张三'
AND 课程 = '语文'
/*
此时第二个窗口一直处于执行状态;
新建第三个会话窗口,用于分析查看阻塞语句;
*/
--查看锁的信息,更多信息(sp_lock:http://msdn.microsoft.com/zh-cn/library/ms187749.aspx)
exec sp_lock;
--SELECT * FROM sys.dm_tran_locks; --比第一个信息多些
--可以看到,会话ID号 spid=54 处于等待状态,mode='U'为更新锁
--下面查看 session_id=54 是被什么会话阻塞了.
SELECT blocking_session_id, wait_duration_ms, session_id
FROM sys.dm_os_waiting_tasks
WHERE session_id=54
go
--或
EXEC sp_who2 active --BlkBy 被谁阻塞……
--结果为session_id=52阻塞了.接下来看看其运行了什么语句;
SELECT t.text
FROM sys.dm_exec_connections c
CROSS APPLY sys.dm_exec_sql_text (c.most_recent_sql_handle) t
WHERE c.session_id = 52
--直接删除session_id = 52的会话,此会话的语句中断,后面的语句正常执行;
KILL 52
SELECT * FROM tb
/*
姓名 课程 分数
---------------------
张三 语文 90
张三 数学 83
李四 语文 74
李四 数学 84
李四 物理 94
*/