Αισιόδοξος συγχρονισμός και αποτροπή χαμένων ενημερώσεων — DedSec Project
Αισιόδοξος συγχρονισμός και αποτροπή χαμένων ενημερώσεων Μηχανισμός και συμβόλαιο Δύο συντάκτες μπορεί να διαβάσουν έκδοση 4 και να αντικαταστήσουν ο ένας τις αλλαγές του άλλου αν η…
Μηχανισμός και συμβόλαιο
Δύο συντάκτες μπορεί να διαβάσουν έκδοση 4 και να αντικαταστήσουν ο ένας τις αλλαγές του άλλου αν η ενημέρωση ελέγχει μόνο ID. Η αισιόδοξη ενημέρωση απαιτεί η έκδοση να παραμένει αυτή που διαβάστηκε. Ακριβώς μία αντικρουόμενη εγγραφή πετυχαίνει. Ο δεύτερος συντάκτης πρέπει να διαβάσει νέα δεδομένα και να συγχωνεύσει ή να ζητήσει απόφαση· τυφλή επανάληψη ακυρώνει την προστασία.
Σε HTTP API χρησιμοποιείται ισχυρό ETag από την ανάγνωση και If-Match κατά τη μεταβολή. Παρωχημένη προϋπόθεση συνήθως επιστρέφει 412. Ο validator πρέπει να καλύπτει την προστατευόμενη αναπαράσταση και σύγκριση και εγγραφή να γίνονται ατομικά στον διακομιστή. Έλεγχος μόνο στον πελάτη δημιουργεί νέο ανταγωνισμό. Η άσκηση SQL δείχνει τον μηχανισμό χωρίς διακομιστή.
Τοπικό παράδειγμα
import sqlite3
from contextlib import closing
with closing(sqlite3.connect(":memory:")) as db:
db.execute("CREATE TABLE doc(id INTEGER PRIMARY KEY, rev INTEGER, body TEXT)")
db.execute("INSERT INTO doc VALUES (1,4,'old')")
sql = "UPDATE doc SET body=?,rev=rev+1 WHERE id=? AND rev=?"
first = db.execute(sql, ("editor A",1,4)).rowcount
second = db.execute(sql, ("editor B",1,4)).rowcount
assert (first, second) == (1, 0)
assert db.execute("SELECT body FROM doc").fetchone() == ("editor A",)
print("stale write rejected")
Έλεγχοι αποτυχίας και όρια
Επαλήθευσε ότι μηδενικές επηρεασμένες γραμμές εμφανίζονται ως σύγκρουση, όχι επιτυχία. Δοκίμασε χωριστά ανύπαρκτη και παρωχημένη εγγραφή σύμφωνα με την πολιτική αποκάλυψης του API. Διατήρησε εξουσιοδότηση μέσα στη συναλλαγή εγγραφής. Ο μετρητής έκδοσης εντοπίζει παρέμβαση αλλά δεν αποφασίζει αν δύο αλλαγές συγχωνεύονται σημασιολογικά.