newasp home
用户管理  |  用户注册
首 页 ┆ 文章中心 ┆ 下载中心 ┆ 子昀网络生活随笔 ┆ 客户留言
  • 站点首页
  • 电脑网络技术
  • 图形图象技术
  • 网络应用
  • 多媒体技术
  • 电脑入门初步
  • 网络推广技术
  • 程序数据库设计
  • Linux技术在线
用户名: 密码:
当前位置:PC我爱社区 → 文章中心 → 程序数据库设计 → 文章内容

在SQL Server 2005中解决死锁问题

减小字体 增大字体 作者:网络  来源:转载  发布时间:2008-5-11 3:14:15

文红论文发表翻译,专业提供各类论文发表、论文翻译.咨询电话:010-67432929
COOCO让您不再为高额出差费用犯愁? 像素科技--全力推出主机租用特惠行动!

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

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

use Northwind begin 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中对死锁进行进一步的处理。

    现在不同了,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 catch end

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

    但是现在又面临一个新的问题: 错误被掩盖了,一但问题发生并且超过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 catch endif 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的代码,或许再也不需要考虑死锁问题了。

[] [返回上一页] [打 印]
  • ·上一篇文章:SQL Server 2005 SP1的新特性
  • ·下一篇文章:如何建立SQL Server 2005数据库邮件

文章评论评论内容只代表网友观点,与本站立场无关!

用户名: ! 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容: !

         (注“!”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码

频道栏目导航

  • 电脑网络技术
  • 图形图象技术
  • 网络应用
  • 多媒体技术
  • 电脑入门初步
  • 网络推广技术
  • 程序数据库设计
  • Linux技术在线

本类热门阅览

  • · Windows下JSP开发环境的配置
  • · Dreamweaver经典问题大搜罗
  • · 编制完美的IE网页木马
  • · 黑客编程:Delphi写QQ聊天记录器演示...
  • · 利用ASP.NET技术动态生成HTML页面
  • · C++ Builder中消息处理过程及应用
  • · 用C++ Builder实现网络连接检测程
  • · 黑客编程:ASP木马代码
  • · 用C++ Builder实现桌布自动更新
  • · 让IE使用多线程下载网页
  • · ASP.NET技术FAQ
  • · 用API函数实现串行通讯

相关文章

  • ·在SQL Server 2005中解决死锁问题

关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 管理登陆

PC我爱社区 站长:子昀 点击这里和我联系
沪ICP备06047794号