在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语句将会使用表锁,而不是行锁,从而增大了死锁的几率。
热门信息
阅读 (118)
1 在Web上修改指定文件位置的Web.config阅读 (110)
2 使用XCopy备份指定日期之后的资料阅读 (110)
3 VS复制项目生成的文件到另外一个项目运行目录下阅读 (108)
4 使用angularJS 绑定站点信息阅读 (105)
5 ASP.NET MVC 上传文件