热门搜索:Photoshop 平面设计 Linux Vista Windows ASP.NET qq word 病毒 XP Excel 标志设计 

使用 TRY/CATCH 语句解决 SQL Server 2005 死锁

来源:未知(读取中...) 2007-5-18 【字体: 】 切换为

 

请注意,这个前置 CATCH 语句块包含一个 ROLLBACK。这样做的原因是,即使捕获了死锁错误,事务也不会回滚。事务仍然要失败,但是,现在您有责任在 TRY/CATCH 语句中回滚事务。那么,区别在哪里?尽管您不能使事务继续进行,但是您能够 重试事务!在 TRY/CATCH 语句中进行重试

  在 SQL Server 2000 的 T-SQL 中,错误 1205 令人沮丧之处是它提供的建议:“Rerun the transaction.”问题是,至少在 SQL Server 2000 的 T-SQL 中,您不能做到这一点。但是,由于 SQL Server 2005 的 TRY/CATCH 为我们提供了捕获死锁错误的方法,现在,重试事务是可能实现的。

  以下代码正文说明了一种执行重试操作的方法。这段代码仍然使用与前面相同的标题:

DECLARE @Tries tinyint
SET @Tries = 1
WHILE @Tries <= 3
BEGIN
 BEGIN TRANSACTION
 BEGIN TRY
  INSERT Authors VALUES
   (@au_id, @au_lname, '', '', '', '', '',
'11111', 0)
  WAITFOR DELAY '00:00:05'
  SELECT * FROM authors WHERE au_lname LIKE 'Test%'
  COMMIT
  BREAK
 END TRY
 BEGIN CATCH
  SELECT ERROR_NUMBER() AS ErrorNumber
  ROLLBACK
  SET @Tries = @Tries + 1
  CONTINUE
 END CATCH;
END

  这段代码的功能是通过一个 WHILE 循环添加一个重试操作。我将重试次数设置为 3,重试次数是可以配置的。至少我们现在有了一种在 T-SQL 内重试一个死锁牺牲品代码的方法 — 这是我们过去一直无法做到的。

  但是,需要注意整个事务是在 WHILE 循环内进行的 — 而不是在循环外部。因此执行循环时,事务不仅在每个循环体内部开始,而且也在其中结束 — 不是 TRY 语句块执行完毕,返回一个 COMMIT,就是 CATCH 语句块执行,返回一个 ROLLBACK。如果 TRY 成功,TRY 语句块将以一个 BREAK 语句结束,退出 WHILE 循环。否则,CATCH 语句块将重试计数器加 1,以一个 CONTINUE 语句结束本次循环,重新执行下次 WHILE 循环。事实上,您有实现重试事务的代码 — 就像错误 1205 告诉我们做的那样。但现在,重试操作完全在 T-SQL 内部完成。

  SQL Server 2005 也提供帮助解决死锁问题的其他方法,例如 SNAPSHOT ISOLATION 级别和用于 READ COMMITTED 的新选项(称为 READ COMMITTED SNAPSHOT)。然而,这一事实 — 现在,通过 SQL Server 2005,您能够对事务进行编码并捕获死锁错误(并重试它们) — 已经意味着您拥有一个可任意支配、功能更加强大的工具。

上一页  [1] [2] [3] 

关注此文的读者还看过:
    用户评论
评论内容:不能超过100字,需审核,请自觉遵守互联网相关政策法规。
发表评论: 匿名发表 用户名: loading 位网友发表了评论 查看评论
(0/100)
"Mysql基础教程" 推荐文章
  • 此栏目下没有推荐文章