数据准备
- 创建表并写入数据
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');
- 打开输出与跟踪标示开关,方便后面分析
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
- 用sp_readerrorlog
写在后面
DeadLock是两个会话的资源抢占,数据库主动放弃其中一个并继续执行另一个会话的场景。通过分析拿到的这两个会话的sql与waitresource等信息,可以快速地确定造成DeadLock的原因,通过优化业务逻辑或者优化sql的执行效率(减少锁的范围或更快的释放锁)来避免掉。