sky*_*yde 10 sql database sql-server deadlock
从我的承诺来看,不可能完全阻止交易陷入僵局.
我希望从应用程序代码的角度来看,交易永远不会失败.所以我已经看到这个模式用于Microsoft SQL,我想知道这是一个好主意吗?
DECLARE @retry tinyint
SET @retry = 5
WHILE @retry >0
BEGIN
BEGIN TRANSACTION
BEGIN TRY
// do transaction her
COMMIT
BREAK
END TRY
BEGIN CATCH
ROLLBACK
if (ERROR_NUMBER() = 1205 OR ERROR_NUMBER() = 1222)
BEGIN
SET @retry = @retry - 1
IF @retry = 0
RAISEERROR('Could not complete transaction',16,1);
WAITFOR DELAY '00:00:00.05' -- Wait for 50 ms
CONTINUE
END
ELSE
BEGIN
RAISEERROR('Non-deadlock condition encountered',16,1);
BREAK;
END
END CATCH;
END
你所拥有的实现并不是一个好主意,因为它在没有发现实际错误的情况下盲目地重试.例如,如果错误是超时,则可能最终将连接占用超时量的5倍,而无需解决问题.
一种更好的方法是检测它是错误1205 - 死锁受害者并仅在这种情况下重试.
您可以使用:
IF ERROR_NUMBER() = 1205
Run Code Online (Sandbox Code Playgroud)
请参阅文档ERROR_NUMBER().
| 归档时间: |
|
| 查看次数: |
11115 次 |
| 最近记录: |