Java SQL中的Spring事务回滚

Java SQL中的Spring事务回滚,java,sql-server,Java,Sql Server,我必须从Java/Spring调用SQL Server存储过程,SP中有一个try/catch块,将错误记录到一个表中。日志记录在那里是必要的,因为SP也被手动调用或从数据库作业调用,但在我的例子中会导致错误,因为来自Spring的调用是事务性的,请参阅 catch块中的回滚是否解决了我的问题?如果是,这是一个好的实践吗?我是说 BEGIN CATCH IF XACT_STATE() != 0 ROLLBACK TRAN INSERT INTO TBL_ERROR ... END

我必须从Java/Spring调用SQL Server存储过程,SP中有一个try/catch块,将错误记录到一个表中。日志记录在那里是必要的,因为SP也被手动调用或从数据库作业调用,但在我的例子中会导致错误,因为来自Spring的调用是事务性的,请参阅

catch块中的回滚是否解决了我的问题?如果是,这是一个好的实践吗?我是说

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

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

您应该在SP中添加对活动事务的支持(例如spring调用)

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吗?这会更简单