[英]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.