1

私は以下のような手順を持っています

BEGIN
    SET NOCOUNT ON

    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'X')
        UPDATE TABLE X 
        SET ROW = 4
        WHERE NAME = 'STEVE'

    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Y')
        UPDATE TABLE Y
        SET ROW = 5
        WHERE NAME = 'ART'
END

2つのIFステートメントをアトミック性で評価したい場合、BEGINTRANおよびCOMMITTRANカプセル化を追加する必要がありますか?

4

3 に答える 3

1

はい、アトミック性が必要な場合はトランザクションを使用する必要があります。

于 2012-09-05T17:50:33.010 に答える
1

BEGIN / END TRANを使用しても、2つのIFステートメントが両方とも評価されることは保証されません。最初のSELECT/UPDATEがエラーで失敗した場合、2番目のSELECT/UPDATEは実行されない可能性があります。

ただし、BEGIN / END TRANは、両方のUPDATEステートメントが実行されるか、どちらも実行されないことを保証します。

于 2012-09-05T18:12:48.603 に答える
1

これでさらに深刻な問題が発生する可能性があると思います。テーブルXが存在しない場合、UPDATEに参照があるため、プロシージャはコンパイルに失敗します。

于 2012-09-05T18:33:06.647 に答える