簡體   English   中英

春季交易-SQL中的ROLLBACK

[英]Spring Transaction - ROLLBACK in SQL

我必須從Java / Spring調用SQL Server存儲過程,並且SP中有一個try / catch塊,並將錯誤記錄到表中。 因為SP也可以手動調用或從數據庫作業中調用,所以那里的日志記錄是必需的,但由於Spring的調用是事務性的,因此在我的情況下會導致錯誤,請參閱https://stackoverflow.com/a/15984867/302151

catch塊中的ROLLBACK是否可以解決我的問題?如果是,這是一個好習慣嗎? 我的意思是

BEGIN CATCH
  IF XACT_STATE() != 0
    ROLLBACK TRAN
  INSERT INTO TBL_ERROR ...
END CATCH

如果不起作用,建議的解決方案是什么?

您應該在SP中添加對活動事務的支持(從春季呼吁示例)。

BEGIN
  DECLARE @tranCount INT = @@TRANCOUNT
  BEGIN TRY
    IF @tranCount = 0
      BEGIN TRAN
    ELSE 
      SAVE TRAN myTran

    -- Do task here

    IF @tranCount = 0
      COMMIT
  END TRY
  BEGIN CATCH
    DECLARE @xstate INT = XACT_STATE()                              
    IF @xstate = 1
    BEGIN
        IF @trancount = 0       
        BEGIN
            -- The transaction was initiated here and it's valid, so rollback               
            ROLLBACK
        END
        ELSE 
        BEGIN 
            -- The transaction wasn't initialised here.
            -- So just rollback to the save point 
            ROLLBACK TRANSACTION myTran
        END
    END
    ELSE IF @xstate = -1     
    BEGIN
        -- Invalid transaction. There is only one think to do...
        ROLLBACK
    END

    -- Now you can log here (no transaction running so autocommit)

    -- 
    IF @tranCount = 0
    BEGIN
      -- One of both
      ;THROW     -- SQL 2013 and above to rethrow the error (if needed)
      RAISERROR ...  -- SQL 2008R2 and before
    END
    ELSE 
    BEGIN
      -- Here if Spring need a transaction, you can initialise one just beforre rethrow error
      BEGIN TRAN
      -- one of both
      ;THROW     -- SQL 2013 and above to rethrow the error (if needed)
      RAISERROR  -- SQL 2008R2 and before
    END

  END CATCH

您確定沒有自動創建的事務就無法從Spring中執行SQL SP嗎? 這樣會更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM