当前位置: 首页 > news >正文

SQL Server 2005中解决死锁问题

SQL Server 2005中解决死锁问题

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
posted on 2011-05-09 09:20 Fanr_Zh 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/Amaranthus/archive/2011/05/09/2040820.html

相关文章:

  • PIX配置手册一(简单配置命令)
  • sql server 根据指定字段排序编号 update 与 order by 联合使用
  • MD5 报文摘要算法
  • 获取 Android 设备的唯一标识码
  • Android Studio 3.0项目迁移所遇到的坑
  • (转)ObjectiveC 深浅拷贝学习
  • grep过滤用法介绍(三)
  • Android Activity和Intent机制 学习笔记(显示网页,显示地图,打电话)
  • 07-JS中 li 排序
  • [WCF安全系列]从两种安全模式谈起
  • EIGRP路由协议中邻居的发现以及恢复
  • vim配色方案
  • Spring-基于构造函数的依赖注入
  • 快速清理系统垃圾和迅雷5.8版以前的隐藏数据库
  • 谁说Windows 7 比 XP 不注重用户体验?
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 分享的文章《人生如棋》
  • 08.Android之View事件问题
  • canvas绘制圆角头像
  • codis proxy处理流程
  • Docker容器管理
  • HTTP请求重发
  • HTTP中GET与POST的区别 99%的错误认识
  • Invalidate和postInvalidate的区别
  • JavaScript创建对象的四种方式
  • tweak 支持第三方库
  • 服务器之间,相同帐号,实现免密钥登录
  • 讲清楚之javascript作用域
  • #define,static,const,三种常量的区别
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (java)关于Thread的挂起和恢复
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)Linux整合apache和tomcat构建Web服务器
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .net6Api后台+uniapp导出Excel
  • .NET下的多线程编程—1-线程机制概述
  • /etc/fstab 只读无法修改的解决办法
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @WebService和@WebMethod注解的用法
  • [ 第一章] JavaScript 简史
  • [17]JAVAEE-HTTP协议
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [autojs]autojs开关按钮的简单使用
  • [C# 基础知识系列]专题十六:Linq介绍
  • [c++] C++多态(虚函数和虚继承)
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符