Java SQL中的Spring事务回滚
我必须从Java/Spring调用SQL Server存储过程,SP中有一个try/catch块,将错误记录到一个表中。日志记录在那里是必要的,因为SP也被手动调用或从数据库作业调用,但在我的例子中会导致错误,因为来自Spring的调用是事务性的,请参阅 catch块中的回滚是否解决了我的问题?如果是,这是一个好的实践吗?我是说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
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吗?这会更简单