3

次のSQLブロックがある場合(SQL SERVER 2008 R2):

BEGIN
    BEGIN TRAN

    DELETE FROM dbo.fooData
    WHERE LastUpdate < DateAdd(hour, -1,GETUTCDATE())

    COMMIT

    BEGIN TRAN

    DELETE FROM dbo.barData
    WHERE SessionID NOT IN (SELECT sub.SessionId FROM dbo.fooData sub)

    COMMIT
    RETURN 0
END

fooDataから削除されたデータが2回目の削除で表示されるようにするには、ステートメント間で明示的なCOMMITを実行する必要があると想定しています。これは正しいです?理想的には、これらすべてを1つのトランザクションにまとめたいと思います。例:

BEGIN
    BEGIN TRAN

    DELETE FROM dbo.fooData
    WHERE LastUpdate < DateAdd(hour, -1,GETUTCDATE())

    DELETE FROM dbo.barData
    WHERE SessionID NOT IN (SELECT sub.SessionId FROM dbo.fooData sub)

    COMMIT
    RETURN 0
END

私の恐れは、2番目のステートメントが最初の削除されたデータを取得しないことです。これはストアドプロシージャの一部であるため、リターンがあります。削除のカスケードや結合には興味がありません。この方法には多少の制約があります。

4

2 に答える 2

3

同じトランザクション/セッションは、それ自体の変更を確認できます。他のセッションでは、このセッションからのこれらのコミットされていないトランザクションは表示されません

したがって、2番目のフォーム(1つの広いトランザクション)は安全に使用できます。

于 2011-05-02T15:03:23.367 に答える
2

2番目の例を使用できます。

同じトランザクションを実行しているため、前の操作の情報にアクセスしています。

分離によると、他の操作は、まだ完了していないトランザクション中に変更されたデータにアクセスできません。分離の問題は、同時トランザクション(複数のトランザクションが同時に発生する)の場合に発生します。ただし、あなたは同じトランザクションであるため、トランザクションは最初の操作の結果にアクセスできます。

于 2011-05-02T15:03:27.320 に答える