0

我讀過很多人傾向於在程序開始時SET XACT_ABORT ONSET XACT_ABORT OFF如果交易由SET終止XACT_ABORT ON

CREATE PROC myProc 
AS 
Begin 
BEGIN TRAN 
SET XACT_ABORT ON 
[..code1 that might throw an error..] 
[..code2..] 
SET XACT_ABORT OFF [?] 
COMMIT TRAN 
END 
SET XACT_ABORT OFF [?] 

由於運行時錯誤將終止程序,SET XACT_ABORT將被保留爲ON。我有一些問題:

  1. 你在哪裏設置它?在CREATE PROC定義之前,在BEGIN之後或BEGIN TRAN之後? SET在連接層面,所以我想所有三個都不會有所作爲?

  2. 什麼時候變成OFF如果發生了錯誤ON

回答

1

在CREATE PROC定義沒有太多意義之前設置XACT_ABORT。與ANSI_NULLS或QUOTED_IDENTIFIER不同,此選項不作爲存儲過程的屬性存儲。我想說你應該在CREATE PROC myProc AS之後立即設置XACT_ABORT,或者在第一個BEGIN之後設置XACT_ABORT,你也可以在這裏設置SET NOCOUNT。

我不打擾設置XACT_ABORT關閉。如果任何代碼部分需要將其關閉(例如,在忽略某些錯誤的TRY-CATCH塊內部),它應該在該特定TRY塊內部將其關閉,並在END CATCH結束時將其重新設置。

欲瞭解更多信息,請參閱:http://www.sommarskog.se/error_handling/Part1.html

+0

感謝您的回覆。爲什麼我們希望它在默認關閉時打開? – Kenny

+0

有關詳細信息,請參見http://www.sommarskog.se/error_handling/Part2.html#classification。 –