我有一个按预期工作的存储过程。小片如下所示:
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调用中,需要什么来识别异常/错误? ...阅读所有消息?
答案 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