クエリを単純にラップすると、次のようになります。
BEGIN TRANSACTION
COMMIT TRANSACTION
その中で何かが失敗した場合、自動的にロールバックしますか?
他のコードを見ると、エラーをチェックしているように見えます。エラーがある場合は、GOTO ステートメントを実行し、ROLLBACK TRANSACTION を呼び出します。
しかし、挿入/更新のたびに IF( @@ERROR <> 0) をチェックしなければならないのは、作業の割り当てのようです。
クエリを単純にラップすると、次のようになります。
BEGIN TRANSACTION
COMMIT TRANSACTION
その中で何かが失敗した場合、自動的にロールバックしますか?
他のコードを見ると、エラーをチェックしているように見えます。エラーがある場合は、GOTO ステートメントを実行し、ROLLBACK TRANSACTION を呼び出します。
しかし、挿入/更新のたびに IF( @@ERROR <> 0) をチェックしなければならないのは、作業の割り当てのようです。
私は通常、ストアド プロシージャ内でこのようなことを行います。物事を適切かつ安全に保ち、遭遇したエラーをすべて伝えます。
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
-- Code goes here
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
DECLARE
@ERROR_SEVERITY INT,
@ERROR_STATE INT,
@ERROR_NUMBER INT,
@ERROR_LINE INT,
@ERROR_MESSAGE NVARCHAR(4000);
SELECT
@ERROR_SEVERITY = ERROR_SEVERITY(),
@ERROR_STATE = ERROR_STATE(),
@ERROR_NUMBER = ERROR_NUMBER(),
@ERROR_LINE = ERROR_LINE(),
@ERROR_MESSAGE = ERROR_MESSAGE();
RAISERROR('Msg %d, Line %d, :%s',
@ERROR_SEVERITY,
@ERROR_STATE,
@ERROR_NUMBER,
@ERROR_LINE,
@ERROR_MESSAGE);
END CATCH
はい、トランザクションが機能しない場合は、トランザクションを明示的にロールバックすることが重要です。
私はいつも息子に、残しておきたい歯だけ磨けばいいと言っています。
この場合、実行したくないコマンドのみをロールバックする必要があります。
これにより、オフエラーの場合にトランザクションが自動的にロールバックされます
SET XACT_ABORT ON
BEGIN TRANSACTION
-- CODE HERE
COMMIT TRANSACTION
トランザクション制御には、begin、commit、rollback を使用します。BEGIN TRANSACTION を指定してトランザクションを開始します。次に、必要なさまざまな SQL ステートメントを配置します。次に、コミットまたはロールバックを発行してトランザクションを終了します。COMMIT TRANSACTION は、BEGIN ステートメントの後にデータベースに対して行ったすべての変更をコミットし、いわば永続的なものにします。ROLLBACK TRANSACTION は、BEGIN ステートメントの後にデータベースに対して行ったすべての変更をロールバックします。ただし、変数の値は変更されません。
例:
BEGIN TRANSACTION
UPDATE table SET column = 'ABC' WHERE column = '123'
COMMIT TRANSACTION
--//column now has a value of 'ABC'
BEGIN TRANSACTION
UPDATE table SET column = 'ABC' WHERE column = '123'
ROLLBACK TRANSACTION
--//column still has it's previous value ('123') No changes were made.