SQLの「削除」ステートメントに続いて、「Where in in」ステートメントが同じトランザクションになりますか?
-
27-10-2019 - |
質問
次の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番目の例を使用できます。
あなたは同じ取引を行っているため、以前の操作の情報にアクセスしています。
隔離はそう言っています 他の操作は、まだ完了していないトランザクション中に変更されたデータにアクセスできません。分離の問題は、同時トランザクション(同時に複数のトランザクションが発生する)の場合に発生します。 ただし、あなたは同じトランザクションであるため、トランザクションは最初の操作の結果にアクセスできます。
所属していません StackOverflow