数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过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不可少,发生冲突后需要等待一段时间,@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的代码,或许再也不需要考虑死锁问题了。

转载于:https://www.cnblogs.com/Bear-Study-Hard/archive/2006/02/08/326891.html

在SQL Server 2005中解决死锁(转)相关推荐

  1. SQL Server 2005中解决死锁问题

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

  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. [原创]基于frida的脱壳工具
  2. android平台使用java动态生成公私钥,并导出证书文件
  3. Duilib学习笔记《04》— 窗体显示
  4. php mysql长连接聊天室_PHP之探索MySQL 长连接、连接池
  5. 华科开源多目标跟踪(MOT)实时新SOTA:FairMOT
  6. PKU 3273  PKU 3258  pku 1905 PKU 3122 二分运用题目
  7. unity 草 可以一棵棵种吗?_5种多肉叶插成活率超高,养一棵成活一大片,种都没地方种...
  8. TypeError: float() argument must be a string or a number, not 'datetime.date'
  9. 【知识图谱系列】解耦Transformation和Propagation的深度图神经网络
  10. mac编译linux开源软件,Mac 端超好用的免费开源软件,我推荐这几款
  11. 截图工具Snagit试用免费激活方法
  12. 魔兽争霸 java_魔兽争霸3Java问题
  13. 基于OpenCV的在图片上画刻度尺坐标、分划版、侧微尺、十字双边带刻度
  14. 如何使用C#把数据写到EXCEL文档中
  15. 【IDEA】IDEA修改项目名称
  16. 汽车厂商集体大降价,谁更受伤?
  17. LaTeX 使用tips与EDAS论文提交
  18. (转)使用Excel批量给数据添加单引号和逗号
  19. abap源代码---正常生产订单打印/两种选择
  20. 天刀论剑显示服务器,天刀S2论剑 各段位奖励称号外观及属性一览

热门文章

  1. android 重启app_[Boot]Android系统启动-zygote篇
  2. muduo网络库学习(五)服务器监听类Acceptor及Tcp连接TcpConnection的建立与关闭
  3. Qt学习笔记-----Model/View架构之自定义Model
  4. 用计算机实现智能解题,浙江省信息技术学考复习模块2——计算机功能、智能处理、字处理...
  5. mysql providername,c#访问各数据库的providerName各驱动
  6. AndroidStudio 如何关闭 Install Run
  7. Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法
  8. POJ 1064 -- Cable master(二分)
  9. android 进程间的通信,Android native进程间通信实例-binder结合共享内存
  10. SQL数据更新/删除