7

私は次のコードを持っています。一般的な例として、トランザクションがRETURN.

BEGIN TRANSACTION
    BEGIN TRY
        IF NOT EXISTS(SELECT 1 FROM dbo.tblProducts WHERE intProductID = @intProductID)
            BEGIN
                SELECT 'Product does not exists' AS strMessage
                RETURN
            END

        UPDATE dbo.tblProducts SET
            curPrice = 10
        WHERE
            intProductID = @intProductID

        SELECT 'Success' AS strMessage

    END TRY 

    BEGIN CATCH
        SELECT ERROR_MESSAGE() AS strMessage
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION
    END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION
4

4 に答える 4

8

以下のようになるはずです

BEGIN TRY
    SET NOCOUNT ON
    SET XACT_ABORT ON
    BEGIN TRANSACTION
        IF NOT EXISTS(SELECT 1 FROM dbo.tblProducts 
                          WHERE intProductID = @intProductID)
        BEGIN
            SELECT 'Product does not exists' AS strMessage
            Rollback TRan
            RETURN
        END

        UPDATE dbo.tblProducts SET
        curPrice = 10
        WHERE
        intProductID = @intProductID

        SELECT 'Success' AS strMessage
    COMMIT TRAN
END TRY 

BEGIN CATCH
    SELECT ERROR_MESSAGE() AS strMessage
    ROLLBACK TRANSACTION
END CATCH
于 2012-08-19T09:06:59.033 に答える
3

上記のコードを実行してチェックSELECT @@TRANCOUNTし、ROLLBACK. 返品後、@@TRANCOUNT1 であり、が開いたままrollbackになっていることを示す取引を正常に行うことができました。transaction

于 2012-08-19T02:54:06.617 に答える
0

次の DBA.StackExchange の回答に投稿したストアド プロシージャ テンプレートを参照してください。これは、トランザクションでの TRY / CATCH の使用に対処し、トランザクションがアプリ レイヤーで開かれている場合でもネストされた呼び出しを処理するためです。

ストア プロシージャだけでなく、C# コードでもトランザクションを処理する必要がありますか

于 2016-01-28T21:26:17.987 に答える