SQL Server 2005中解决死锁问题


数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过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@# 
commit 
print @#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 ON 
declare @r int 
set @r = 1 
while @r  <= 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@# 
    set @r = @r + 1 
    continue 
  end catch 
end

    
解决方法当然就是重试,但捕获错误是前提。rollback后面的waitfor不

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

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

declare @r int 
set @r = 1 
while @r  <= 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@# 
    set @r = @r + 1 
    continue 
  end catch 
end 
if ERROR_NUMBER()  <> 0 
begin 
  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的代码,或许再也不需要考虑死锁问题了。

from csdn:http://blog.csdn.net/arrow_gx/archive/2008/05/26/2483155.aspx

SQL Server 2005中解决死锁问题相关推荐

  1. 在SQL Server 2005中解决死锁(转)

    数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的SQL语句放在两个不同的连接里面,并且在5秒 ...

  2. SQL Server 2005中的分析服务功能[转]

    XXXX(不知道为什么CnBlogs上的人这么抵制XXXX,呵呵--)上推出了"体验SQL Server 2005"活动,当然啦,一些关于SQL Server 2005的文章被翻译 ...

  3. sql server 2005 中的同义词

    在SQL SERVER 2005中,终于出现了同义词了,大大方便了使用. 同义词是用来实现下列用途的数据库对象: 为本地或远程服务器上的另一个数据库对象(称为"基对象")提供备选名 ...

  4. SQL Server 2005中专用管理员连接 (DAC) 使用技巧修改系统表的方法

    Server 2005 专用管理员连接 (DAC) 使用技巧 1 什么是专用管理员连接? SQL Server 2005 为管理员提供了一种特殊的诊断连接,以供在无法与服务器建立标准连接时使用. 2 ...

  5. 无法启动SQL Server 2005中的SQL Server(MSSQLSERVER)服务--zt

    原地址:http://blog.csdn.net/erway/archive/2007/08/07/1729230.aspx 问题:无法启动SQL Server 2005中的SQL Server(MS ...

  6. 打破第一范式的要求 (中英对照)Michael Rys 对 SQL Server 2005 中XML 的 评论——对微软SQL Server项目经理Michael Rys博士的采访

    Michael Rys on XML in SQL Server 2005 Michael Rys对SQL Server 2005中XML的评论 Michael Rys is one of two p ...

  7. SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?

    如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...

  8. SQL Server 2005中的Row_Number分页

    早就听说了SQL Server 2005中的Row_Number分页了,但是一直就没认真理解这个Row_Number的含义.这两天实在是太忙了,但是还是坚持将这个弄明白了.在说分页之前还是来了解一下R ...

  9. SQL Server 2005 中的商务智能和数据仓库

    微软发布了SQL Server 2005,对于微软与BI来说这是一个非常重要的版本,它完善了微软在BI方面的产品线.SQL Server 2005以及 Visual Studio .net2005的整 ...

最新文章

  1. Freemarker模板嵌套
  2. 联盟和部落大战一触即发,你有票了吗?
  3. 初一模拟赛总结(2019.5.25)
  4. 如何优雅的激怒C/C++程序员
  5. java zero copy 实现,关于Zero Copy
  6. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别
  7. atitit. orm框架的hibernate 使用SQLQuery createSQLQuery addEntity
  8. zabbix监控pppoe线路_Zabbix 完整的监控流程
  9. Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果
  10. input 限制只能输入数字,且保留小数后两位
  11. fedora13上安装mhvtl报错
  12. 【图像分割】基于matlab GUI阙值+边缘检测+区域法图像分割【含Matlab源码 817期】
  13. bpa软件视频教程,BPA是什么软件
  14. c语言如何输出动态数组,C语言动态数组的使用实现代码
  15. RK3399触摸不准,修改drivers中gt9xx.h的cfg
  16. php eot,php中理解print的EOT分界符
  17. 双11还没完,商家已经被退货“逼疯”了
  18. 鲁大师发布2022半年报手机UI排行榜,vivo OriginOS成为最流畅UI
  19. word删除空白页面
  20. 一度智信:拼多多店铺怎么盈利

热门文章

  1. 华为:5G技术前景堪忧,运营商将很难从5G赚钱
  2. 重磅《美国机器智能国家战略》
  3. IDC:2018年中国制造业十大预测
  4. 业界 | 计算芯片革命来临?英伟达谷歌入局紧逼英特尔
  5. 1 分钟带你认识从 � 到 锟斤拷
  6. Announcing the Updated NGINX and NGINX Plus Plug‑In for New Relic (Version 2)
  7. Bzoj1835:[ZJOI2010]基站选址
  8. vmware nat模式原理探究,实现虚拟机跨网段管理
  9. Linux修改/etc/profile配置错误command is not found自救方法
  10. CSS如何正确显示人民币符号¥