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个或更多存储过程中实现的方法,而且我很难使其失败并重复。

+0

什么样的麻烦?请发布您收到的错误或意外行为。 –

+0

我没有收到任何错误,因为我目前停留在如何强制SQL中的错误,以强制重试。在生产中,错误每月发生一次,也许 - 由于转换为int重复的guid。 – kaplooeymom

+0

在提交事务强制执行错误之前,您可以使用RAISERROR。您需要一个条件来决定何时提升错误,可能会使用计数器每隔一段时间强制执行错误。 –

你应该检查它的失败原因,或者你可以产生一个无限循环(就像已经存在的主键一样)。

因为我不知道你为什么要这样做,我不会说这是一个糟糕的设计,但它确实是可疑的。如果失败是由于某种原因,异常消息会告诉你为什么,而不是“暴力破坏”你的数据库,直到它达到你期望的目标为止,应该攻击问题的原因(坏数据?并发性?很多原因可能是导致异常)

编辑:你应该照顾你的日志太大,对一个无限循环将填补你的硬盘最终