Frage

Verursacht dies eine Race-Bedingung mit MySQL (InnoDB):

  1. Starten Sie die Transaktion.

  2. Versuchen Sie Datensatz zu erhalten.

  3. Wenn Datensatz existiert nicht, Rückkehr.

  4. Wenn Datensatz vorhanden ist, es löschen und einen Protokolleintrag hinzufügen sagen, wird gelöscht.

  5. End-Transaktion (Commit / Rollback).

Ist es möglich, ein anderer Prozess kurz vor dem Löschschritt in 2b zu starten, um das Vorhandensein des Datensatzes erkennen und haben dann beide Prozesse eingeben Position löschen Einträge in das Protokoll?

Gibt es irgendwelche Vorsichtsmaßnahmen, die ich zu ergreifen?

Danke.

War es hilfreich?

Lösung

Verwenden Sie ‚wählen für update‘ in Schritt 2 nur ein Prozess auf der Zeile in der Lage, damit eine Sperre zu bekommen das Szenario zu vermeiden Sie beschrieben.

Andere Tipps

Journeyman Programmierer, glaube ich, hat die richtige Lösung. Da Sie angegeben haben verwenden Sie ein gebrochenes ORM-Tool (eine, die nicht zulassen, dass Sie für die Aktualisierung abfragen) Ich würde vorschlagen, dass Sie Ihre INSERT in die Log-Tabelle in einen Trigger auf dem Löschvorgang bewegen, so dass Sie das Duplikat vermeiden Eintrag.

Starten Sie die Transaktion.

Datensatz löschen / * die gleichen Kriterien, die Sie für verwenden ‚versuchen Datensatz zu bekommen‘ * /

Wenn Antwortsatz angibt wurde zwar gelöscht, fügen Sie einen Protokolleintrag.

End-Transaktion (Commit / Rollback).

Nicht mehr Race-Bedingung.

Ja, es ist möglich, eine andere Transaktion, die Tabelle zu überprüfen, nachdem Sie es gelesen haben.

Noch schlimmer ist, weil, wie Transaktionen arbeiten, auch nachdem Sie die Zeile löschen, werden alle neuen Transaktionen, die die Zeile sehen beginnen, weil Sie verpflichtet, noch nicht haben die Lösch.

SELECT ... FOR UPDATE ist eine Möglichkeit, es zu verhindern.

LOCK TABLE tablename eine andere.

Leider, da Sie einen ORM verwenden, ich konnte nicht sagen, ob es die Möglichkeit, entweder von diesen zu tun hat.

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