SQL虽然循环重试交易直到成功
问题描述:
我需要一个事务,当它失败时,回滚并重试。SQL虽然循环重试交易直到成功
哪里是我到目前为止有:
CREATE PROCEDURE [dbo].[Save]
@MasterID as bigint
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
Declare @successtrans bit = 0
While @successtrans = 0
Begin -- while
BEGIN TRY
BEGIN TRANSACTION
DELETE SomeRecords WHERE ParentRecordID = @MasterID
INSERT INTO SomeRecords
Select FieldOne, FieldTwo, FieldThree, ParentRecordID
FROM OtherRecords
WHERE ParentRecordID = @MasterID
INSERT INTO AnotherTable
SELECT FieldA, FieldB, FieldC, FieldD
FROM MoreRecords
WHERE FieldD = @MasterID
COMMIT TRANSACTION
set @successtrans = 1
END TRY
BEGIN CATCH
IF(XACT_STATE()) = -1 -- Determine the state of the current transction (1 = committable, 0 = no active transaction (same as @@Trancount check), -1 = active, but uncommittable) only on severity 17 or higher
BEGIN
DECLARE @ErrorNumber bigint = ERROR_Number(),
@ErrorSeverity int = ERROR_SEVERITY(),
@ErrorState int = ERROR_STATE(),
@ErrorProcedure varchar(100) = ERROR_PROCEDURE(),
@ErrorLine int = ERROR_LINE(),
@ErrorMessage varchar(Max) = ERROR_MESSAGE()
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
INSERT INTO ErrorLog(ErrorNumber, ErrorSeverity, ErrorState, ErrorProcedure, ErrorLine, ErrorMessage, ErrorDate)
VALUES(@ErrorNumber, @ErrorSeverity, @ErrorState, @ErrorProcedure, @ErrorLine, @ErrorMessage, GETDATE())
END -- if
END CATCH
End -- while
END -- proc
GO
的问题是,将这项工作对于我在做什么?逻辑说是的。但这是一种我需要在10个或更多存储过程中实现的方法,而且我很难使其失败并重复。
答
你应该检查它的失败原因,或者你可以产生一个无限循环(就像已经存在的主键一样)。
因为我不知道你为什么要这样做,我不会说这是一个糟糕的设计,但它确实是可疑的。如果失败是由于某种原因,异常消息会告诉你为什么,而不是“暴力破坏”你的数据库,直到它达到你期望的目标为止,应该攻击问题的原因(坏数据?并发性?很多原因可能是导致异常)
编辑:你应该照顾你的日志太大,对一个无限循环将填补你的硬盘最终
什么样的麻烦?请发布您收到的错误或意外行为。 –
我没有收到任何错误,因为我目前停留在如何强制SQL中的错误,以强制重试。在生产中,错误每月发生一次,也许 - 由于转换为int重复的guid。 – kaplooeymom
在提交事务强制执行错误之前,您可以使用RAISERROR。您需要一个条件来决定何时提升错误,可能会使用计数器每隔一段时间强制执行错误。 –