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.
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)
最好的方法是使用您已经拥有的表格。创建两个表——table-a、table-b 对于测试,您甚至可以使用相同的信息更新同一列,这样就不会影响任何真实数据。
例如 UPDATE table_a 设置 ID = ID 其中 ID = 100;
打开同一个数据库的两个会话。一方面,运行
在两次运行
然后,将更新语句复制到相反的会话并同时运行。在一个,
成两半
我现在刚刚尝试了这个并开始使用 MS-SQL
使用
sp_getapplock
系统存储过程来获取您的示例代码所需的任何锁定。严格来说,这是一个Dijkstra 信号量。不过还是很有用的
这是另一种类似于上面发布的方法-->
查询窗口 #1 中使用的脚本
查询窗口 #2 中使用的脚本
要添加到查询窗口 #1 的脚本
有关这方面的更多详细信息,请参阅http://ajitananthram.wordpress.com/2014/02/23/scripts-to-force-a-deadlock-in-sql-server/