数据库操作的死锁是不可避免的,本文最没有说明死锁是如何产生的,重点在于解决死锁,通过SQL Server
2005
, 现在似乎有了一种新的解决办法。
将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁。
use Northwind
begin tran
insert into Orders(CustomerId) values ( ' ALFKI ' )
waitfor delay ' 00:00:05 ' -- 推迟到5秒钟后执行
select * from Orders where CustomerId = ' ALFKI '
commit
print ' commit '
SQL Server对付死锁的办法是牺牲掉其中的一个,抛出异常,并且回滚事务。在SQL Server 2000 ,语句一旦发生异常,T - SQL将不会继续运行,上面被牺牲的连接中, print ' commit ' 语句将不会被运行,所以我们很难在SQL Server 2000的T - SQL中对死锁进行进一步的处理。
现在不同了,SQL Server 2005可以在T - SQL中对异常进行捕获,这样就给我们提供了一条处理死锁的途径:
下面利用的try catch来解决死锁。
SET XACT_ABORT ON
declare @s int
set @s = 1
while @s <= 3
begin
begin tran
begin try
insert into Orders(CustomerId) values ( ' ALFKI ' )
waitfor delay ' 00:00:05 '
select * from Orders where CustomerId = ' ALFKI '
commit
break
end try
begin catch
rollback
waitfor delay ' 00:00:03 ' -- 推迟到3秒钟后执行
set @s = @s + 1
continue
end catch
end
将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁。
use Northwind
begin tran
insert into Orders(CustomerId) values ( ' ALFKI ' )
waitfor delay ' 00:00:05 ' -- 推迟到5秒钟后执行
select * from Orders where CustomerId = ' ALFKI '
commit
print ' commit '
SQL Server对付死锁的办法是牺牲掉其中的一个,抛出异常,并且回滚事务。在SQL Server 2000 ,语句一旦发生异常,T - SQL将不会继续运行,上面被牺牲的连接中, print ' commit ' 语句将不会被运行,所以我们很难在SQL Server 2000的T - SQL中对死锁进行进一步的处理。
现在不同了,SQL Server 2005可以在T - SQL中对异常进行捕获,这样就给我们提供了一条处理死锁的途径:
下面利用的try catch来解决死锁。
SET XACT_ABORT ON
declare @s int
set @s = 1
while @s <= 3
begin
begin tran
begin try
insert into Orders(CustomerId) values ( ' ALFKI ' )
waitfor delay ' 00:00:05 '
select * from Orders where CustomerId = ' ALFKI '
commit
break
end try
begin catch
rollback
waitfor delay ' 00:00:03 ' -- 推迟到3秒钟后执行
set @s = @s + 1
continue
end catch
end