Ich bin auf der Suche nach einer effizienten Möglichkeit zur Implementierung von Compare-and-Swap-Operationen in Berkeley DB. Im Moment benutze ich eine wirklich alte Version, aber auf den ersten Blick hat sogar die neueste Version (die von der Oracle-Website vertrieben wird) keine einzige Methode für eine solche Operation.Vergleichen und wechseln Sie in Berkeley DB JE?
Ich war für eine eine Art von Verfahren, die wie
replace(Transaction, Key, ExpectedValue, NewValue)
mit folgenden Semantik: DB-Wert wird mit einem bestimmten Schlüssel zugeordnet ist, wenn dieser Wert vorhanden und es ist gleich dieser Wert auf ExpectedValue dann wird zu NewValue geändert, andernfalls gibt die Methode den nicht erfolgreichen OperationStatus zurück.
Sieht so aus, als gäbe es keine Methode, also frage ich mich, wie dies auf die effizienteste Art und Weise geschehen soll.
Im Moment bin ich mit den folgenden Ansatz: Ich mache
db.get(null, key) -> {currentValue, version}
db.put(null, key, {currentValue, newRandomIdVersion})
db.get(null, key)
I Vergleichswert und Version, wenn sie übereinstimmen ich letzte Update alte Version löschen. Wenn ein Schritt fehlschlägt, wird der gesamte Prozess neu gestartet.
Ich fühle, dass dies sehr suboptimal ist - liege ich falsch?
Haben Sie etwas versucht? –
Versuchen Sie als ersten Crack, eine Transaktion zu verwenden, und prüfen Sie, ob die Leistung im Maßstab ausreichend ist. –
Meinen Sie nur Zähler innerhalb der Transaktion aktualisieren? Es würde nicht helfen - gleichzeitige Transaktionen überschreiben sich selbst. – Alex