WEB开发网
开发学院数据库MSSQL Server 使用 TRY/CATCH 语句解决 SQL Server 2005 死锁 阅读

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

 2007-05-17 09:36:54 来源:WEB开发网   
核心提示: 以下示例使用 TRY/CATCH 语句对前面使用的代码进行了改写,代码标题相同,使用 TRY/CATCH 语句解决 SQL Server 2005 死锁(3),但是代码正文不同:BEGIN TRANSACTIONBEGIN TRYINSERT Authors VALUES(@au_id,

以下示例使用 TRY/CATCH 语句对前面使用的代码进行了改写。代码标题相同,但是代码正文不同:

BEGIN TRANSACTION
BEGIN TRY
 INSERT Authors VALUES
 (@au_id, @au_lname, '', '', '', '', '', '11111', 0)
 WAITFOR DELAY '00:00:05'
 SELECT COUNT(*) FROM Authors
 COMMIT
END TRY
BEGIN CATCH
 SELECT ERROR_NUMBER() AS ErrorNumber
 ROLLBACK
END CATCH;
SELECT @@TRANCOUNT AS '@@Trancount'

现在,在连接到 SQL Server 2005 的并列窗口中运行这些代码,在此之前您需要确认已经删除了 authors 表格中任何可能阻止插入操作的数据;或者,您可以使用前置 DELETE 语句。

两个窗口返回的 @@TRANCOUNT 级别都为 0,这表明仍然发生了死锁,但 TRY/CATCH 语句捕获了这次发生的死锁。死锁牺牲品的批处理没有再次中止,可在它的输出结果中看到错误:

ErrorNumber
-----------
1205
@@Trancount
-----------
0

您应该已经发现 TRY/CATCH 语句具有的威力了。因为死锁错误能够为 CATCH 语句块所捕获,所以批处理将不再中止,T-SQL 代码也能继续执行。对于死锁牺牲品而言,死锁错误 1205 将代码放入 CATCH 语句块 — 在这里您可以使用新的错误处理函数浏览死锁错误。前置代码仅使用 ERROR_NUMBER() 函数取代 @@ERROR 变量,您也可以使用 ERROR_MESSAGE()、ERROR_PROCEDURE()、ERROR_SEVERITY() 和 ERROR_STATE()。这些函数的功能一目了然,它们提供的功能比我们以往使用的更多。

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

上一页  1 2 3 4  下一页

Tags:使用 TRY CATCH

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接