数据库操作的死锁是不可避免的,本文最没有说明死锁是如何产生的,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法。 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁。 use Northwind begintran insertinto 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@sint set@s=1 while@s<=3 begin begintran begin try insertinto 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 Server 2005, 现在似乎有了一种新的解决办法。将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁。use Northwind begin tran insert into Orders(CustomerId) values(ALFKI) wait