0

TSQL で部分的なロールバックを理解しようとしています。チュートリアルに従って、この例を見つけましたが、理解できません/最初のオブジェクトが失敗した場合、2番目のオブジェクトをテーブルに保存できますか?

BEGIN TRAN
PRINT 'First Transaction: ' + CONVERT(VARCHAR,@@TRANCOUNT)

INSERT INTO People VALUES ('Tom')

BEGIN TRAN
PRINT 'Second Transaction: ' + CONVERT(VARCHAR,@@TRANCOUNT)

INSERT INTO People VALUES ('Dick')

ROLLBACK TRAN
PRINT 'Rollback: ' + CONVERT(VARCHAR,@@TRANCOUNT)

「トム」が失敗した場合、「ディック」を救うことができますか? 多対多のロールバック トランザクションを実現するために、これが必要です。したがって、Obj A、Obj B を作成し、両方が成功した場合は Obj C を追加し、そうでない場合は失敗をロールバックし、成功した INSERT クエリを保持します。

4

1 に答える 1

1

トランザクションが成功したときにトランザクションをコミットしたいだけのようです。以下のコードは、スクリプトがディックを詰まらせても、トムを保持します...

CREATE TABLE #People
    ( 
        VAL VARCHAR(100)
    );

DECLARE @stop BIT = 0;
BEGIN TRY
    BEGIN TRAN
    PRINT 'First Transaction: ' + CONVERT(VARCHAR,@@TRANCOUNT)

    INSERT INTO #People VALUES ('Tom')
    COMMIT 
END TRY
BEGIN CATCH
    ROLLBACK TRAN;
    SET @stop = 1;
END CATCH;
SELECT * FROM #People;

IF @stop = 0
BEGIN TRY
    BEGIN TRAN
    PRINT 'Second Transaction: ' + CONVERT(VARCHAR,@@TRANCOUNT)

    INSERT INTO #People VALUES ('Dick');
    SELECT * FROM #People;

    RAISERROR(
        'Choke on Dick' -- stop snickering
        , 16
        , 1
        );

    COMMIT;
END TRY
BEGIN CATCH
    PRINT 'Rollback: ' + CONVERT(VARCHAR,@@TRANCOUNT)
    ROLLBACK TRAN
END CATCH

SELECT * FROM #People;

DROP TABLE #People;
于 2013-05-29T22:43:54.117 に答える