gpt4 book ai didi

sql - 如何在SQL Server上模拟DEADLOCK?

转载 作者:行者123 更新时间:2023-12-01 19:15:58 25 4
gpt4 key购买 nike

我正在尝试模拟 SQL Server 上的死锁。

_|worker_id|salary|
1|1 |100 |
2|2 |300 |

事务 1 在 5 秒内完成。

/* TRANSACTION 1*/
Use dbmcw;

DECLARE @sal1 INT, @sal2 int;

BEGIN TRAN;

SELECT @sal1 = salary
FROM dbo.deadlock_demonstration WITH(UPDLOCK)
WHERE worker_id = 1;

WAITFOR DELAY '00:00:05.000';

SELECT @sal2 = salary
FROM dbo.deadlock_demonstration WITH(UPDLOCK)
WHERE worker_id = 2;

COMMIT TRAN;

事务 2 在 3 秒内完成。

/* TRANSACTION 2*/
Use dbmcw;

DECLARE @sal1 INT, @sal2 int;

BEGIN TRAN;

SELECT @sal2 = salary
FROM dbo.deadlock_demonstration WITH(UPDLOCK)
WHERE worker_id = 2;

SELECT @sal1 = salary
FROM dbo.deadlock_demonstration WITH(UPDLOCK)
WHERE worker_id = 1;

COMMIT TRAN;

SQL Server 没有给出任何错误。没有发生死锁。为了模拟死锁,我应该改变什么?

最佳答案

您可以使用下面所示的步骤来创建死锁。首先,使用示例数据创建全局临时表。

--Two global temp tables with sample data for demo purposes.
CREATE TABLE ##Employees (
EmpId INT IDENTITY,
EmpName VARCHAR(16),
Phone VARCHAR(16)
)
GO

INSERT INTO ##Employees (EmpName, Phone)
VALUES ('Martha', '800-555-1212'), ('Jimmy', '619-555-8080')
GO

CREATE TABLE ##Suppliers(
SupplierId INT IDENTITY,
SupplierName VARCHAR(64),
Fax VARCHAR(16)
)
GO

INSERT INTO ##Suppliers (SupplierName, Fax)
VALUES ('Acme', '877-555-6060'), ('Rockwell', '800-257-1234')
GO

现在在 SSMS 中打开两个空查询窗口。将 session 1 的代码放置在一个查询窗口中,将 session 2 的代码放置在另一个查询窗口中。然后逐步执行两个 session 中的每一个,根据需要在两个查询窗口之间来回。请注意,每个事务都对另一个事务也请求锁定的资源拥有锁定。

Session 1                   | Session 2
===========================================================
BEGIN TRAN; | BEGIN TRAN;
===========================================================
UPDATE ##Employees
SET EmpName = 'Mary'
WHERE EmpId = 1
===========================================================
| UPDATE ##Suppliers
| SET Fax = N'555-1212'
| WHERE SupplierId = 1
===========================================================
UPDATE ##Suppliers
SET Fax = N'555-1212'
WHERE SupplierId = 1
===========================================================
<blocked> | UPDATE ##Employees
| SET Phone = N'555-9999'
| WHERE EmpId = 1
===========================================================
| <blocked>
===========================================================

导致死锁;一个事务完成,另一个事务中止,并向客户端发送错误消息 1205。

关闭“ session 1”和“ session 2”的 SSMS 查询窗口以提交(或回滚)任何打开的事务。最后,清理临时表:

DROP TABLE ##Employees
GO
DROP TABLE ##Suppliers
GO

关于sql - 如何在SQL Server上模拟DEADLOCK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com