Kann eine SQL -Anweisung "Löschen" anschließend eine Anweisung "Wo nicht in" in derselben Transaktion sein?

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

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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top