SQL Server SET XACT_ABORT ON和JAVA

时间:2017-05-01 14:03:09

标签: java sql-server exception transactions

我有一个按预期工作的存储过程。小片如下所示:

BEGIN
SET XACT_ABORT ON;
BEGIN TRANSACTION;  

INSERT Table1...;
INSERT Table2...;

COMMIT TRANSACTION; 
END

如果表2中出现错误,则表1的插入回滚。问题是Java调用存储过程。如果XACT_ABORT打开,下面的代码不会抛出异常;

    psmt = conn.prepareStatement(query);
    psmt.setInt(1, id);
    psmt.execute();
    psmt.close();

我看到当我在SQL Server Management Studio中执行存储过程时,它会返回两条消息。成功之一,错误之一:虽然插入回滚。

(1 row(s) affected)
Msg 515, Level 16, State 2...

在Java调用中,需要什么来识别异常/错误? ...阅读所有消息?

2 个答案:

答案 0 :(得分:0)

尝试添加:

set nocount on;

在程序的顶部?

答案 1 :(得分:0)

我在不久的过去与XACT_ABORT挣扎,你的问题让我在记忆中走了一段路。我的问题与你的问题相似,似乎我的修复工作也适用于你的情况。
XACT_ABORT将回滚所有交易,使您处于执行代码之前的状态。这意味着麻烦查询的所有记录,包括错误信息都会随风而去;但是,有一个地方从这次回滚中是“安全的”,这是一个变量。您可以利用它为您工作,我将在下面向您展示。

以下是我使用的代码结构:

BEGIN
    SET XACT_ABORT ON;
    BEGIN TRANSACTION;  
    DECLARE @MSG VARCHAR(MAX);

    BEGIN TRY
        INSERT Table1...;
    END TRY
    BEGIN CATCH
        SET @MSG = 'Table1: ' + ERROR_MESSAGE();
        GOTO failure; /* SEGMENT BELOW WHICH WOULD TAKE CARE OF YOUR ERROR MESSAGES*/
    END CATCH
    /* REPEAT ABOVE SEGMENT FOR ALL INSERTS*/

    GOTO SUCCESS; /* THIS IS HERE SO THAT YOU CAN SKIP THE FAILURE SEGMENT IN THE EVENT THAT ALL WENT WELL UP UNTIL HERE*/

    FAILURE:
        ROLLBACK; 
        RETURN @MSG;

    SUCCESS:
        COMMIT TRANSACTION; 
END