数据库操作的死锁是不可避免的,本文最没有说明死锁是如何产生的,重点在于解决死锁,通过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 
posted on 2007-07-10 13:35  阳春  阅读(440)  评论(0)    收藏  举报