私はより多くのTSQLを学ぶC#開発者です。私はこのようなスクリプトを書きました:トランザクションでtry catchが必要ですか?
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
2番目の例では、より正確である私はなぜ表示されません。最初のものは同じように動作しませんか?最初のものはすべてのテーブルを更新するか、まったく更新しないようですか?コミットする前に@@TRANCOUNT
のチェックが必要なのはなぜわかりません。
私はあなたと同じ議論をします。さらに、try/catchパターンは、私がtry/squelchと呼ぶ反パターンです。それはキャプチャし、エラーが発生し、次に黙っていきます。それはエラーを処理するものではなく、それらを抑止しています。トランザクションにはtry/catchブロックは必要ないと言われています。特にトリガをしている場合は、try/catchを使用すると、これまで以上に多くの問題が発生する可能性があります。 –
2番目の例の何かがあれば、catchはcatchブロックの後ではなくtryブロック内になければなりません。 – Kritner