在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不可少,发生冲突后需要等待一段时间,@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的代码,或许再也不需要考虑死锁问题了。
walkdans blog
- · 30分钟正则表达式指导
- · 不算不知道 44% 数据库开发者使用MySQL
- · 立即释放.net下的com组件
- · XHTML的目标,规则和细节
- · SQL Server 2005 提供的分页查询支持
- · ASP.NET程序中常用的三十三种代码
- · Sql server存储过程和C#分页类简化你的代码
- · SQL Server 2005新功能-TSQL
- · 在SQL Server 2005中编辑SQL Server 2000 DTS
- · .NET 连接到 Oracle的oci.dll加载错误解决方案
- · 如何在调用线程的时候传递参数
- · 专家预言:PHP将比Java更好更受欢迎
- · 在IIS6.0下ASP .NET 的版本冲突问题
- · 解决SqlTransaction用尽的问题(SQL处理超时)
- · 以前编写Like谓词被忽略的使用方法
- · 在编写存储过程时使用 Set NoCount On
- · ASP.NET 2.0运行时简要分析
- · .Net中如何操作IIS(原理篇)
- · 用.net开发不同操作系统下应用的winform的size大小问题
- · SQL Server数据库文件恢复技术
- · SQL SERVER中一些常见性能问题的总结
- · .NET下对二进制文件进行加密解密(C#)
- · 利用.NET的File控件上传文件的最终解决方案(个人版)
- · 如何把图片、声音等存储到sql中
- · MS-SQL server数据库开发精典技巧
- · 全文索引—CONTAINS语法
- · 获得所有表信息的SQL语句
- · .NET扫描远程计算机注册表
- · 利用JS获取IE客户端IP及MAC的实现
- · 简单而又复杂的ASP.NET编程模型
- · C#2.0终于有了?:便捷判断的单分支版
- · SQL Server 2005 Data Mining简介
- · ASP.NET控件开发之
- · ASP.NET中用哪种方式表格化数据
- · .NET平台下几种SOCKET模型的简要性能供参考
- · 使用 XML 模板 (MSSQL手册)
- · 使用带批注的 XDR 架构创建 XML 视图
- · 在XPath查询中指定轴(转自MSSQL手册)
- · JavaScript极速狂飙:CSS样式表的背景渲染效率
- · javascript应用:实现复选框全选/全不选切换
- · JavaScript极速狂飙:大容量字符型数组的快速检索
- · JavaScript极速狂飙:组合拼接字符串的效率
- · 图片自动缩小的js代码,用以防止图片撑破页面
- · PHP漏洞中的战争
- · automation服务器不能创建对象
- · Oracle数据库的备份及恢复策略研究
- · PHP程序加速探索之脚本执行速度测试
- · PHP中路径问题的解决方案
- · 学以致用 驳“ASP低能论”
- · 另类扩展名同样执行ASP
- · 语言决不是语法的不同之.NET 版本计算表达式的值
- · ASP中实现的类似URLEncode的编码函数及对应解码函数
- · 数据对象扩展成默认组件 PHP开发小组发布PHP5.1.0
- · ASP.NET 揭秘 ASP.NET页面的结构
- · 关于Sql server数据库日志满的快速解决办法
- · PHP+MySQL分页显示示例分析
- · ORACLE SQL性能优化系列(九)
- · ORACLE SQL性能优化系列(七)
- · ORACLE SQL性能优化系列(八)
- · JSP渐进学习教程4

