模拟死锁

 在2个查询窗口分别执行执行事务1,2,将导致死锁:

 

 

 

--事务模拟测试2

begin tran

 

UPDATE Table1 set END_TIME=GETDATE() where  id=N'f998b30a5d384f7ebfeb4646fbed6c88';

WaitFor Delay '00:0:20';

 

update Table2  set END_TIME=GETDATE() where ID='94b9f18f953f4a3b837153969c6bfc1d';

WaitFor Delay '00:0:10';

Rollback tran

 

 

--事务模拟测试2

begin tran

 

update Table2  set END_TIME=GETDATE() where ID='94b9f18f953f4a3b837153969c6bfc1d';

 

WaitFor Delay '00:00:20';

UPDATE Table1 set END_TIME=GETDATE() where  id=N'f998b30a5d384f7ebfeb4646fbed6c88';

WaitFor Delay '00:00:20';

Rollback tran

 

 

 

执行后,会出现下面类似的死锁信息:

 

消息 1205,级别 13,状态 51,第 2 行 

事务(进程 ID 89)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

 

注意:必须在测试代码上,rollback tran 前,也增加

 

WaitFor Delay '00:00:20';

 

否则,SQLSERVER 2008 不会出现死锁,好多例子都没有这一句,是无法模拟死锁的。

 

除了使用Update语句,Insert语句在事务中,更容易出现死锁,比如如下的例子:

 

SQL1:

 

 

 

use DBDemo  

begin tran

insert into [BookMarks]([BookMarkName]

      ,[BookMarkDesc]

      ,[BookMarkText]) values('人民日报合集2014','人民日报合集2015','人民日报合集2015')

waitfor delay '00:00:10'

select * from [BookMarks] where [BookMarkName] = '人民日报合集2014'

commit tran

 

 

 

SQL2:

 

 

 

use DBDemo  

begin tran

insert into [BookMarks]([BookMarkName]

      ,[BookMarkDesc]

      ,[BookMarkText]) values('人民日报合集2015','人民日报合集2015','人民日报合集2015')

waitfor delay '00:00:10'

select * from [BookMarks] where [BookMarkName] = '人民日报合集2015'

commit tran

 

 

同时执行这2个查询,发现执行时间超过了语句中需要延迟的10秒,然后,其中一个查询出现了死锁:

 

(1 行受影响)

消息 1205,级别 13,状态 45,第 7 行

事务(进程 ID 52)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

 

这说明,在事务情况下,Insert语句将会使用表锁,而不是行锁,从而增大了死锁的几率。

 

相关内容推荐

返回
顶部