Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Racebedingung zwischen Auswahl und Aktualisierung

Ich gehe davon aus, dass Ihr UPDATE -Anweisung selbst überprüft den lastmodified Wert, den Sie in Ihrem SELECT gelesen haben Aussage, wie neunseitig vorschlägt.

Wenn lastmodified ist ein DATE , gibt es eine potenzielle Racebedingung, wenn seit einem DATE mehrere Aktualisierungen derselben Zeile in derselben Sekunde vorgenommen wurden hat nur sekundengenaue Granularität. Wenn lastmodified ist ein TIMESTAMP , andererseits ist das Fenster, in dem die Racebedingung auftreten kann, seit einem TIMESTAMP viel eingeschränkter wird zwischen 3 und 9 Stellen mit einer Genauigkeit von weniger als einer Sekunde haben (3 auf den meisten Windows-Rechnern, 6 auf den meisten Unix-Rechnern). Es ist ziemlich unwahrscheinlich, aber nicht unmöglich, dass Sie zwei Updates zur gleichen Millisekunde oder sogar zur gleichen Mikrosekunde haben. Aber es ist nicht unfehlbar.

Anstelle des letzten Änderungsdatums können Sie einen sequenzgenerierten Wert verwenden. Das kann garantieren, dass Sie kein Update verlieren, da eine NOCYCLE-Sequenz nicht zweimal denselben Wert zurückgibt. Aber wenn Sie diesen Weg einschlagen, verlieren Sie entweder den Informationsvorteil eines letzten Aktualisierungsdatums für jede Zeile oder Sie speichern ein paar zusätzliche Datenbytes in jeder Zeile der Tabelle. Jeder dieser Kompromisse kann sich je nach Ihrer Anwendung lohnen oder beide können mehr Probleme verursachen als lösen.