15

クエリを単純にラップすると、次のようになります。

BEGIN TRANSACTION



COMMIT TRANSACTION

その中で何かが失敗した場合、自動的にロールバックしますか?

他のコードを見ると、エラーをチェックしているように見えます。エラーがある場合は、GOTO ステートメントを実行し、ROLLBACK TRANSACTION を呼び出します。

しかし、挿入/更新のたびに IF( @@ERROR <> 0) をチェックしなければならないのは、作業の割り当てのようです。

4

4 に答える 4

30

私は通常、ストアド プロシージャ内でこのようなことを行います。物事を適切かつ安全に保ち、遭遇したエラーをすべて伝えます。

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
于 2008-11-14T17:13:03.420 に答える
4

はい、トランザクションが機能しない場合は、トランザクションを明示的にロールバックすることが重要です。

私はいつも息子に、残しておきたい歯だけ磨けばいいと言っています。

この場合、実行したくないコマンドのみをロールバックする必要があります。

于 2008-11-14T16:38:07.127 に答える
4

これにより、オフエラーの場合にトランザクションが自動的にロールバックされます

SET XACT_ABORT ON

BEGIN TRANSACTION
-- CODE HERE
COMMIT TRANSACTION
于 2008-11-14T16:41:52.920 に答える
1

トランザクション制御には、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.
于 2008-11-14T16:45:20.667 に答える