模拟死锁的代码


26

我正在测试我的应用程序,我需要一些代码来稳定地模拟数据库站点上的死锁(如果可能,请使用sql脚本)。

谢谢。

添加:

重现仅涉及一张表的死锁


2
我不太明白这个问题。你能改写一下吗?显然,下面的两个人对您的理解足够好,但是我不太关注您。您的意思是“稳定”地模拟死锁的代码吗?出现僵局后您将要做什么?您是否只想证明它会发生?
jcolebrand

Answers:


29

最好的方法是使用您已有的表。创建两个表-table-a,table-b。为了进行测试,您甚至可以使用相同的信息更新同一列,这样就不会影响任何实际数据。

例如,UPDATE table_a设置ID = ID,其中ID = 100;

打开两个会话到同一个数据库。一方面运行

BEGIN TRAN
update table_a set ID=ID where ID = 100;

在两次运行

BEGIN TRAN
update table_b set ID=ID where ID =100;

然后,将更新语句复制到相反的会话并同时运行。在一个

update table_b set ID=ID where ID =100;

成两半

update table_a set ID=ID where ID = 100;

我现在刚刚尝试过并使用MS-SQL

Msg 1205, Level 13, State 56, Line 1
Transaction (Process ID 23) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.


2

这是另一种类似于上面发布的方法->

CREATE TABLE Tbl1 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT)
CREATE TABLE Tbl2 (id INT NOT NULL PRIMARY KEY CLUSTERED, col INT REFERENCES dbo.Tbl1(id))

查询窗口1中使用的脚本

BEGIN TRAN
INSERT dbo.Tbl1 (id, col) VALUES (2, 999)

查询窗口2中使用的脚本

BEGIN TRAN
INSERT dbo.Tbl2 (id, col) VALUES (111, 2)

要添加到查询窗口1的脚本

INSERT dbo.Tbl2 (id, col) VALUES (111, 555)

有关此的其他详细信息,请参阅http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.