Kann eine SQL -Anweisung "Löschen" anschließend eine Anweisung "Wo nicht in" in derselben Transaktion sein?
-
27-10-2019 - |
Frage
Wenn ich den folgenden SQL -Block habe (in 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
Ich gehe davon aus, dass ich zwischen den Aussagen einen expliziten Commiting vornehmen muss, damit die gelöschten Daten von Foodata im zweiten Löschen angezeigt werden. Ist das richtig? Idealerweise möchte ich, dass all dies in einer Transaktion ist. Beispiel:
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
Ich befürchte, dass die zweite Aussage nicht die gelöschten Daten des ersten annehmen wird. Beachten Sie, dass die Rückgabe vorhanden ist, da dies Teil eines gespeicherten Verfahrens ist. Ich bin nicht daran interessiert, Deletten zu kaskadieren oder mich anzuschließen, ich bin etwas auf diese Methode eingeschränkt.
Lösung
Die gleiche Transaktion/Sitzung kann sehen besitzen Änderungen. Andere Sitzungen werden diese nicht übereinstimmenden Transaktionen nicht sehen Dies Sitzung
Ihre 2. Form (eine breitere Transaktion) ist also sicher benutzen.
Andere Tipps
Sie können das zweite Beispiel verwenden.
Da Sie sich in derselben Transaktion befinden, zugreifen Sie auf die Informationen der vorherigen Vorgänge.
Isolation sagt das Andere Vorgänge können nicht auf Daten zugreifen, die während einer Transaktion geändert wurden, die noch nicht abgeschlossen ist. Die Frage der Isolation tritt bei gleichzeitigen Transaktionen auf (mehrere Transaktionen, die gleichzeitig auftreten). Sie sind jedoch die gleiche Transaktion, so dass die Transaktion auf das Ergebnis des ersten Betriebs zugreifen kann und kann.