8

以下は、SQL Server ストアド プロシージャです。以下に示すように、トランザクションの開始時と 2 つのコミットがあります。これは有効ですか (開始は while ループにあり、最初のコミットは同じ while ループにありますが、2 番目のコミットは 2 番目の while ループにあります)? そうでない場合、それを行うための解決策は何ですか?

助けてください。

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'DELETE_COBOC_DATA')
DROP PROCEDURE DELETE_COBOC_DATA
GO

CREATE PROCEDURE DELETE_COBOC_DATA @ORGDN VARCHAR(100), @CHUNK VARCHAR(10) 
AS
BEGIN
    -- some code that executes before while           
    WHILE (@NUM_ROWS_TMPTRADMIN > 0) 
    BEGIN               

        BEGIN TRANSACTION
            -- executes some code
        COMMIT TRANSACTION                              
    END
    -- some more code
    WHILE @NUM_ROWS_TMPDIR > 0
    BEGIN
        -- code code code
        COMMIT TRANSACTION
        -- code code code
    END
    -- some more code here as well
END

私が知っているように、これはMySQLで許可されています

4

1 に答える 1

13

同じトランザクションを 2 回コミットすることはできません。ネストされたトランザクションを持つことはできますが、「部分的な」コミットを持つことはできません。これは、トランザクションの概念と矛盾します (オールオアナッシングです)。両方のコミットが実行されると、2 番目のコミットでエラーがスローされます

The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION
于 2012-12-14T09:55:27.633 に答える