-- 测试代码
-- DROP TABLE Test
CREATE TABLE Test
(
id INT,
name VARCHAR(20),
info VARCHAR(20),
)
CREATE CLUSTERED INDEX IX_Test ON DBO.Test(id)
CREATE NONCLUSTERED INDEX IX_Test_name ON DBO.Test(name)
INSERT INTO Test VALUES(1,'kk',null),(2,'mm',null)
SELECT * FROM Test
------------------------------------------------------------
--打开:窗口【1】
BEGIN TRAN
update dbo.Test set info='A' where id =1
waitfor delay '00:00:10'
update dbo.Test set info='B' where id =2
COMMIT TRAN
------------------------------------------------------------
------------------------------------------------------------
--打开:窗口【2】
BEGIN TRAN
update dbo.Test set info='C' where id =2
update dbo.Test set info='D' where id =1
COMMIT TRAN
------------------------------------------------------------
打开Profile 监控事件locks:deadlock
先执行窗口【1】,再执行窗口【2】。结果窗口【2】死锁:
Profile 捕获到的信息:
方形的图中,键锁 HoBt ID 可以确定是哪个索引:
SELECT * FROM SYS.partitions WHERE hobt_id=72057594043432960
SELECT * FROM SYS.indexes WHERE OBJECT_ID= 1845581613 AND index_id=1
将Profile 捕获到的信息拷贝出来:
主要分为两部分,一部分为进程的执行信息,另一部分为堵塞资源的请求信息。
观察上面这几点,都可以找到死锁的客户端信息和产生死锁的对象,可以大致了解产生这个死锁的过程。
找到的批处理脚本,即可通过其他方法优化解决。
原文链接:https://blog.csdn.net/kk185800961/article/details/41488215