数据准备

  1. 创建表并写入数据
CREATE TABLE Table1 
(
    ID INT PRIMARY KEY,
    Value VARCHAR(50)
);

CREATE TABLE Table2 
(
    ID INT PRIMARY KEY,
    Value VARCHAR(50)
);

INSERT INTO Table1 (ID, Value) VALUES (1, 'Data1');
INSERT INTO Table2 (ID, Value) VALUES (1, 'Data2');

  1. 打开输出与跟踪标示开关,方便后面分析
DBCC TRACEON (3604)
GO
DBCC TRACEON (1222,-1)
GO
生产环境中,谨慎使用,拿到分析数据后,记得及时关闭!!!

模拟场景

1、 开一个新会话,开启一个新事务模拟一个耗时操作

 BEGIN TRANSACTION;
UPDATE Table1 SET Value = 'NewData1' WHERE ID = 1;
WAITFOR DELAY '00:00:10';
UPDATE Table2 SET Value = 'NewData2' WHERE ID = 1;

2、 再开一个新会话一个事务

BEGIN TRANSACTION;
UPDATE Table2 SET Value = 'NewData21' WHERE ID = 1;
WAITFOR DELAY '00:00:10';
UPDATE Table1 SET Value = 'NewData11' WHERE ID = 1;

分析(还原原始逻辑)

  • 用sqlprofiler收集deallock

image-1714398546386

  • 用sp_readerrorlog

image-1714398623392

写在后面

DeadLock是两个会话的资源抢占,数据库主动放弃其中一个并继续执行另一个会话的场景。通过分析拿到的这两个会话的sql与waitresource等信息,可以快速地确定造成DeadLock的原因,通过优化业务逻辑或者优化sql的执行效率(减少锁的范围或更快的释放锁)来避免掉。