据我了解,不可能完全防止事务死锁。
从应用程序代码的角度来看,我希望事务永远不会失败。
我已经看到这种模式用于 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
可恢复错误的重试逻辑应位于客户端代码中。
对于死锁,MSDN 规定在那里做 http://msdn.microsoft.com/en-us/library/ms177453%28SQL.90%29.aspx
如果您在 SQL 中重试,那么最终可能会遇到 CommandTimeout。
还有其他错误,所以你可以编写一个通用处理程序 https://stackoverflow.com/questions/4821668/what-is-good-c-coding-style-for-catching-sqlexception-and-retrying/4821684#4821684
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)