SQL Server DeadLock 分析

本文详细介绍了如何在SQL Server中设置XEvents会话来捕获死锁事件,以及如何通过模拟操作制造死锁。首先,通过新建会话并选择database_xml_deadlock_report事件来配置死锁检测。接着,创建并填充测试数据库表,然后通过两个并发的更新操作来模拟死锁。最后,展示了如何查看和分析死锁报告,以便于理解和解决死锁问题。
摘要由CSDN通过智能技术生成

1. 设置 XEvents 会话以收集死锁

1.1 扩展事件-会话-右键新建会话向导

在这里插入图片描述

1.2 设置会话名称

在这里插入图片描述

1.3 选择要捕获的事件

database_xml_deadlock_report
在这里插入图片描述

1.4 捕获全局字段

在这里插入图片描述

1.5 指定会话存储

在这里插入图片描述

1.6 结束

在这里插入图片描述

1.7 确保启动会话

在这里插入图片描述

2. 制造死锁

2.1 准备数据表及数据

2.1.1 准备数据库

TestBug

2.1.2 创建表

-- TestBug.dbo.Product definition

-- Drop table

-- DROP TABLE TestBug.dbo.Product;

CREATE TABLE TestBug.dbo.Product (
        Id bigint NOT NULL,
        Name nvarchar(50) COLLATE Chinese_PRC_CI_AS NOT NULL,
        Color nvarchar(50) COLLATE Chinese_PRC_CI_AS NOT NULL,
        CreateTime datetime NOT NULL,
        UpdateTime datetime NOT NULL,
        CONSTRAINT PK_Product PRIMARY KEY (Id)
);
-- TestBug.dbo.ProductDescription definition

-- Drop table

-- DROP TABLE TestBug.dbo.ProductDescription;

CREATE TABLE TestBug.dbo.ProductDescription (
        Id bigint NOT NULL,
        ProductId bigint NOT NULL,
        Description nvarchar(500) COLLATE Chinese_PRC_CI_AS NOT NULL,
        CreateTime datetime NOT NULL,
        UpdateTime datetime NOT NULL,
        CONSTRAINT PK_ProductDescription PRIMARY KEY (Id)
);

2.1.3 添加数据

INSERT
        INTO
        TestBug.dbo.Product (Id,
        Name,
        Color,
        CreateTime,
        UpdateTime)
VALUES
         (10001,
N'IPAD',
N'Red',
'2022-11-26 00:00:00.0',
'2022-11-26 20:34:25.46'),
         (10002,
N'Mac',
N'White',
'2022-11-26 00:00:00.0',
'2022-11-26 00:00:00.0');

INSERT
        INTO
        TestBug.dbo.ProductDescription (Id,
        ProductId,
        Description,
        CreateTime,
        UpdateTime)
VALUES
         (20001,
10001,
N'红色的IPAD',
'2022-11-26 00:00:00.0',
'2022-11-26 20:34:34.537'),
         (20002,
10002,
N'白色的Mac电脑',
'2022-11-26 00:00:00.0',
'2022-11-26 00:00:00.0');

2.2 模拟死锁过程

2.2.1 死锁会话脚本A

Begin
        Transaction
        UPDATE
        Product
set
        UpdateTime = GETDATE()
WHERE
        Color = 'Red';

UPDATE
        ProductDescription
set
        UpdateTime = GETDATE()
FROM
        ProductDescription as pd
join Product as p on
        pd.ProductId = p.Id
WHERE
        p.Color = 'Red';

commit transaction;

2.2.2 死锁会话脚本B

UPDATE
        ProductDescription
set
        UpdateTime = GETDATE()
FROM
        ProductDescription as pd
join Product as p on
        pd.ProductId = p.Id
WHERE
        p.Color = 'Red';

2.2.3 步骤 1——新建查询会话A

执行如下脚本

Begin
        Transaction
        UPDATE
        Product
set
        UpdateTime = GETDATE()
WHERE
        Color = 'Red';

在这里插入图片描述

2.2.4 步骤 2——新建查询会话B

执行如下脚本

UPDATE
        ProductDescription
set
        UpdateTime = GETDATE()
FROM
        ProductDescription as pd
join Product as p on
        pd.ProductId = p.Id
WHERE
        p.Color = 'Red';

在这里插入图片描述

2.2.5 步骤 3——回到查询会话A

执行如下脚本

UPDATE
        ProductDescription
set
        UpdateTime = GETDATE()
FROM
        ProductDescription as pd
join Product as p on
        pd.ProductId = p.Id
WHERE
        p.Color = 'Red';

在这里插入图片描述

2.2.6 步骤 4——回到查询会话B

死锁已经产生
在这里插入图片描述

2.2.7 步骤 5——再回到查询会话A

提交事务

commit transaction;

在这里插入图片描述

2.2.8 步骤 6——结束

3. 查看死锁

3.1 选择-检测死锁-查看目标数据

在这里插入图片描述

3.2 双击查看xml_report

在这里插入图片描述

3.3 保存为 xdl文件,然后关闭上一步打开的 XML 页

在这里插入图片描述

3.4 双击打开 或者 直接拖动到SSMS打开

在这里插入图片描述

3.5 查看死锁图

在这里插入图片描述

3.6 结束

参考

https://learn.microsoft.com/zh-cn/azure/azure-sql/database/analyze-prevent-deadlocks?view=azuresql&tabs=ring-buffer

https://learn.microsoft.com/zh-cn/sql/relational-databases/extended-events/quick-start-extended-events-in-sql-server?view=sql-server-ver16

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值