我們最近被空降到一個代碼非常糟糕的新 ETL 專案。我手中有一個包含 700 行和各種更新的查詢。
我想除錯它,SET XACT_ABORT ON;目標是在只有一個事務失敗時回滾所有內容。
但我找到了幾種將其存檔在 StackOverflow 上的方法,如下所示:
BEGIN TRANSACTION;
BEGIN TRY
-- Multiple sql statements goes here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
END CATCH
或者這個:
BEGIN TRY
BEGIN TRANSACTION
-- Multiple sql statements goes here
COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT(ERROR_MESSAGE())
ROLLBACK TRANSACTION
END CATCH
這些都沒有用途SET XACT_ABORT ON;。
我不明白,SET XACT_ABORT ON和使用一樣BEGIN TRY BEGIN TRANSACTION嗎?
我可以只使用:
SET XACT_ABORT ON;
-- Multiple sql statements goes here
并擺脫所有:
BEGIN TRANSACTION;
BEGIN TRY
?
而且,我應該使用BEGIN TRANSACTION然后BEGIN TRY還是相反?
uj5u.com熱心網友回復:
它不一樣。它決定何時拋出錯誤。
您應該始終使用SET XACT_ABORT ON,因為它更一致;幾乎總是,錯誤會停止執行并拋出錯誤。否則,一半的事情會拋出錯誤,另一半會繼續執行。
有一個偉大的文章關于這個整個主題厄蘭Sommarskog的網站,如果你走在這一點上,你會看到它描述了這種奇怪的行為的表。總之,我推薦錯誤處理的通用模式,因為它有很好的檔案記錄,并且為您提供了根據自己的檔案進行調整的機會。一種這樣的調整是使用 raiserror() ,微軟表示停止使用并使用 throw 代替;但是你必須記住 throw() 在 2012 之前的版本中不存在。
uj5u.com熱心網友回復:
感謝@George Menoutis 提供的資源。
我在這里發布我的實用解決方案:
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
-- Multiple sql statements goes here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO
SET XACT_ABORT OFF;
uj5u.com熱心網友回復:
如果您有XACT_ABORT ON,則無需手動捕獲任何錯誤,除非您正在執行錯誤日志記錄。XACT_ABORT將導致所有錯誤導致事務失敗并將其回滾。
所有你需要的是
SET XACT_ABORT ON;
BEGIN TRAN;
--do stuff
COMMIT;
如果只有一個陳述句,那么你甚至不需要BEGIN TRAN;和COMMIT;
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/349847.html
標籤:sql-server 查询语句 试着抓 回滚 xact-中止
上一篇:如何在沒有公共ID的情況下回傳另一個表中尚不存在的行
下一篇:轉置并加入一列SQL
