我是一位學習更多TSQL的c#開發人員。我寫了一個這樣的腳本:交易是否需要嘗試追蹤?
begin transaction
--Insert into several tables
end transaction
但有人告訴我,這不是一個好主意,用這樣的:
BEGIN TRANSACTION;
BEGIN TRY
-- Generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
我不明白爲什麼第二個例子是比較正確的。第一個會不會以同樣的方式工作?看起來第一個會更新所有的表格,或者根本沒有?我不明白爲什麼在提交之前檢查@@TRANCOUNT
是必要的。
我會作出相同的論點,你是。另外,推薦給你的try/catch模式是一種反模式,我稱之爲try/squelch。它捕獲和錯誤,然後默默地進行。這不是處理錯誤,它是壓制他們。這就是說,一個事務不需要try/catch塊。特別是如果你處於觸發狀態,使用try/catch可能會導致比以往更多的問題。 –
如果在第二個例子中有任何事情,提交應該在try塊中,而不是在catch之後......我認爲 – Kritner