在SQL Server 2005中解决死锁(转)
数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法。
将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁。
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来解决死锁。
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语句,可以抛出异常,但却不能直接抛出原来的异常,所以需要重新定义发生的错误,现在,解决方案变成了这样:
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中解决死锁(转)相关推荐
- SQL Server 2005中解决死锁问题
SQL Server 2005中解决死锁问题 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面 ...
- SQL Server 2005中的分析服务功能[转]
XXXX(不知道为什么CnBlogs上的人这么抵制XXXX,呵呵--)上推出了"体验SQL Server 2005"活动,当然啦,一些关于SQL Server 2005的文章被翻译 ...
- sql server 2005 中的同义词
在SQL SERVER 2005中,终于出现了同义词了,大大方便了使用. 同义词是用来实现下列用途的数据库对象: 为本地或远程服务器上的另一个数据库对象(称为"基对象")提供备选名 ...
- SQL Server 2005中专用管理员连接 (DAC) 使用技巧修改系统表的方法
Server 2005 专用管理员连接 (DAC) 使用技巧 1 什么是专用管理员连接? SQL Server 2005 为管理员提供了一种特殊的诊断连接,以供在无法与服务器建立标准连接时使用. 2 ...
- 无法启动SQL Server 2005中的SQL Server(MSSQLSERVER)服务--zt
原地址:http://blog.csdn.net/erway/archive/2007/08/07/1729230.aspx 问题:无法启动SQL Server 2005中的SQL Server(MS ...
- 打破第一范式的要求 (中英对照)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 ...
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...
- SQL Server 2005中的Row_Number分页
早就听说了SQL Server 2005中的Row_Number分页了,但是一直就没认真理解这个Row_Number的含义.这两天实在是太忙了,但是还是坚持将这个弄明白了.在说分页之前还是来了解一下R ...
- SQL Server 2005 中的商务智能和数据仓库
微软发布了SQL Server 2005,对于微软与BI来说这是一个非常重要的版本,它完善了微软在BI方面的产品线.SQL Server 2005以及 Visual Studio .net2005的整 ...
最新文章
- [原创]基于frida的脱壳工具
- android平台使用java动态生成公私钥,并导出证书文件
- Duilib学习笔记《04》— 窗体显示
- php mysql长连接聊天室_PHP之探索MySQL 长连接、连接池
- 华科开源多目标跟踪(MOT)实时新SOTA:FairMOT
- PKU 3273 PKU 3258 pku 1905 PKU 3122 二分运用题目
- unity 草 可以一棵棵种吗?_5种多肉叶插成活率超高,养一棵成活一大片,种都没地方种...
- TypeError: float() argument must be a string or a number, not 'datetime.date'
- 【知识图谱系列】解耦Transformation和Propagation的深度图神经网络
- mac编译linux开源软件,Mac 端超好用的免费开源软件,我推荐这几款
- 截图工具Snagit试用免费激活方法
- 魔兽争霸 java_魔兽争霸3Java问题
- 基于OpenCV的在图片上画刻度尺坐标、分划版、侧微尺、十字双边带刻度
- 如何使用C#把数据写到EXCEL文档中
- 【IDEA】IDEA修改项目名称
- 汽车厂商集体大降价,谁更受伤?
- LaTeX 使用tips与EDAS论文提交
- (转)使用Excel批量给数据添加单引号和逗号
- abap源代码---正常生产订单打印/两种选择
- 天刀论剑显示服务器,天刀S2论剑 各段位奖励称号外观及属性一览
热门文章
- android 重启app_[Boot]Android系统启动-zygote篇
- muduo网络库学习(五)服务器监听类Acceptor及Tcp连接TcpConnection的建立与关闭
- Qt学习笔记-----Model/View架构之自定义Model
- 用计算机实现智能解题,浙江省信息技术学考复习模块2——计算机功能、智能处理、字处理...
- mysql providername,c#访问各数据库的providerName各驱动
- AndroidStudio 如何关闭 Install Run
- Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法
- POJ 1064 -- Cable master(二分)
- android 进程间的通信,Android native进程间通信实例-binder结合共享内存
- SQL数据更新/删除