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的代码,或许再也不需要考虑死锁问题了。
SQL Server 2005中解决死锁问题相关推荐
- 在SQL Server 2005中解决死锁(转)
数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的SQL语句放在两个不同的连接里面,并且在5秒 ...
- 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的整 ...
最新文章
- Freemarker模板嵌套
- 联盟和部落大战一触即发,你有票了吗?
- 初一模拟赛总结(2019.5.25)
- 如何优雅的激怒C/C++程序员
- java zero copy 实现,关于Zero Copy
- Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别、不可重复读与幻读的区别
- atitit. orm框架的hibernate 使用SQLQuery createSQLQuery addEntity
- zabbix监控pppoe线路_Zabbix 完整的监控流程
- Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果
- input 限制只能输入数字,且保留小数后两位
- fedora13上安装mhvtl报错
- 【图像分割】基于matlab GUI阙值+边缘检测+区域法图像分割【含Matlab源码 817期】
- bpa软件视频教程,BPA是什么软件
- c语言如何输出动态数组,C语言动态数组的使用实现代码
- RK3399触摸不准,修改drivers中gt9xx.h的cfg
- php eot,php中理解print的EOT分界符
- 双11还没完,商家已经被退货“逼疯”了
- 鲁大师发布2022半年报手机UI排行榜,vivo OriginOS成为最流畅UI
- word删除空白页面
- 一度智信:拼多多店铺怎么盈利
热门文章
- 华为:5G技术前景堪忧,运营商将很难从5G赚钱
- 重磅《美国机器智能国家战略》
- IDC:2018年中国制造业十大预测
- 业界 | 计算芯片革命来临?英伟达谷歌入局紧逼英特尔
- 1 分钟带你认识从 � 到 锟斤拷
- Announcing the Updated NGINX and NGINX Plus Plug‑In for New Relic (Version 2)
- Bzoj1835:[ZJOI2010]基站选址
- vmware nat模式原理探究,实现虚拟机跨网段管理
- Linux修改/etc/profile配置错误command is not found自救方法
- CSS如何正确显示人民币符号¥