SQLの「削除」ステートメントに続いて、「Where in in」ステートメントが同じトランザクションになりますか?

StackOverflow https://stackoverflow.com/questions/5858685

質問

次の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

私は、食品から削除されたデータが2番目の削除に表示されるように、ステートメント間で明示的なコミットを行う必要があると仮定しています。これは正しいです?理想的には、これらすべてを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番目のステートメントが最初の削除されたデータを選択しないことです。これはストアドプロシージャの一部であるため、リターンがあります。私はカスケードの削除や参加に興味がありません。この方法にはある程度制約されています。

役に立ちましたか?

解決

同じトランザクション/セッションでは、それがわかります 自分の 変更。他のセッションでは、これらのコミットされていないトランザクションはありません これ セッション

したがって、あなたの2番目のフォーム(1つのより広いトランザクション)は 安全 使用する。

他のヒント

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

あなたは同じ取引を行っているため、以前の操作の情報にアクセスしています。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top