SQL Server中解决死锁的新方法介绍

2016-01-29 15:48 5 1 收藏

SQL Server中解决死锁的新方法介绍,SQL Server中解决死锁的新方法介绍

【 tulaoshi.com - SQLServer 】

数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法。

将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁。

use Northwindbegin tran  insert into Orders(CustomerId) values(@#ALFKI@#)  waitfor delay @#00:00:05@#  select * from Orders where CustomerId = @#ALFKI@#commitprint @#end tran@#
  

SQL Server对付死锁的办法是牺牲掉其中的一个,抛出异常,并且回滚事务。在SQL Server 2000,语句一旦发生异常,T-SQL将不会继续运行,上面被牺牲的连接中, print @#end tran@#语句将不会被运行,所以我们很难在SQL Server 2000的T-SQL中对死锁进行进一步的处理。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

现在不同了,SQL Server 2005可以在T-SQL中对异常进行捕获,这样就给我们提供了一条处理死锁的途径:

下面利用的try ... catch来解决死锁。

SET XACT_ABORT ONdeclare @r intset @r = 1while @r <= 3begin  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@#    set @r = @r + 1    continue  end catchend
  

解决方法当然就是重试,但捕获错误是前提。rollback后面的waitfor不可少,发生冲突后需要等待一段时间,@retry数目可以调整以应付不同的要求。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/sqlserver/)

但是现在又面临一个新的问题: 错误被掩盖了,一但问题发生并且超过3次,异常却不会被抛出。SQL Server 2005 有一个RaiseError语句,可以抛出异常,但却不能直接抛出原来的异常,所以需要重新定义发生的错误,现在,解决方案变成了这样:

declare @r intset @r = 1while @r <= 3begin  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@#    set @r = @r + 1    continue  end catchendif ERROR_NUMBER() < 0begin  declare @ErrorMessage nvarchar(4000);  declare @ErrorSeverity int;  declare @ErrorState int;  select    @ErrorMessage = ERROR_MESSAGE(),    @ErrorSeverity = ERROR_SEVERITY(),    @ErrorState = ERROR_STATE();  raiserror (@ErrorMessage,        @ErrorSeverity,        @ErrorState        );end
  

我希望将来SQL Server 2005能够直接抛出原有异常,比如提供一个无参数的RaiseError。

因此方案有点臃肿,但将死锁问题封装到T-SQL中有助于明确职责,提高高层系统的清晰度。现在,对于DataAccess的代码,或许再也不需要考虑死锁问题了。

来源:http://www.tulaoshi.com/n/20160129/1496489.html

延伸阅读
标签: 皮肤护理
问答 图钉提问: 面部除皱有何危害 图老师解答: BOTOX注射除皱:主要解决抬头纹、川字纹、眼角鱼尾纹。 面部除皱的新方法 皮肤护理介绍 脸部是最容易出现皱纹的地方,尤其对于女人来说,最怕看见的就是脸上长皱纹,尤其是眼角、嘴角、额头这些地方...
标签: 瘦身
健走不是只有直直往前走一种方式,而可以根据你的个人需求,有各种变化方式。根据在美国推广健走十多年的《预防》杂志对它的读者回信所做的分析,已有美国民众用以下9种方式,为达成不同目标而走。   为了增加活力而快乐走 即使只是走10分钟的路,都能立即像为车子充电般,变得活力充沛...
标签: 电脑入门
在PPT插入FLASH的方法通常是利用ActiveX中的控件来插入,这种方法操作起来步骤繁琐而且在其它电脑上播放时经常会遇到控件无法正常激活等问题,通过链接的方法插入,虽然简便,但在播放过程中经常会弹出确认按钮,影响PPT放映时用户的体验,这里为大家提供一种通过对象来插入FLASH文件的方法。 主要的步骤如下: 1,通过插入-对象-来自文件...
标签: 健康常识
白领寻找快乐的新方法 一家调查机构在全世界22个国家调查人们的快乐水平,结果显示,美国人的快乐水平最高,有46%的美国人对自己的生活感到快乐,其次是印度,37%的印度人乐呵呵地生活着,而中国人的快乐水平最低,位列榜尾,只有9%的中国人觉得自己活得快乐。 美国人快乐的6个原因 1、相信“磨难中也有快乐&rdquo...
很多朋友并不知道FileStream 这个功能。因为FileStream 一般在安装的时候默认是不启用的,在SQL Server 2008中,引入了Filestream,使用它可以将非机构化大型数据(如文本文档、图像和视频)等以varbinary(max)的形式存储在文件系统中。使用数据库的备份还原功能可以将这些数据一起备份还原。 在选择数据库文件路径那个窗口,有一个标签是"Fil...

经验教程

812

收藏

26
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部