Ich habe diesen Artikel über JPA-Concurrency gelesen, aber entweder bin ich zu dick oder es ist nicht explizit genug.
Ich suche eine datenbankgesteuerte atomare update-if-found-else-insert-Operation (ein UPSERT
).
Es sieht nach meinem armen langsamen Gehirn aus, dass ich - innerhalb einer Transaktion natürlich - eine benannte Abfrage mit einem Sperrmodus von PESSIMISTIC_WRITE
ausführen kann, um zu sehen, ob es irgendwelche Ergebnisse zurückgibt, und dann entweder ein persist()
oder ein update()
danach.
Was mir nicht klar ist, sind die Unterschiede zwischen dieser Operation mit PESSIMISTIC_WRITE
lock und PESSIMISTIC_READ
lock. Ich habe die Sätze gelesen - ich verstehe, dass PESSIMISTIC_READ
nicht wiederholbare Lesevorgänge verhindern soll, und PESSIMISTIC_WRITE
ist ... nun, vielleicht verstehe ich das nicht so gut :-) - aber darunter es ist nur eine SQL SELECT FOR UPDATE
, ja? In beiden Fällen?
Ich möchte eine datenbankgesteuerte atomare update-if-found-else-insert-Operation (ein UPSERT) durchführen.
Ich beantworte vielleicht nicht genau die ganze Frage, aber wenn Sie das obige ohne irgendeine Race Condition implementieren wollen, brauchen Sie IMO eine Tabellenebene LOCK IN EXCLUSIVE MODE (nicht nur Zeilen). Ich weiß nicht, ob dies mit JPA möglich ist. Vielleicht könnten Sie klären, was für Sie akzeptabel wäre.
Ich habe eine solche Situation erlebt und folgendes gefunden:
Pessimistisches Sperren, das heißt, das Sperren von Objekten bei Transaktionsbeginn und das Beibehalten der Sperre während der Transaktion wird von diesen zwei PessimisticLockModes ausgeführt: - LockModeType.PESSIMISTIC_READ - & gt; Entität kann von anderen Transaktionen gelesen werden, aber es können keine Änderungen vorgenommen werden - LockModeType.PESSIMISTIC_WRITE - & gt; Entität kann nicht von anderen Transaktionen gelesen oder geschrieben werden
Link zum Artikel
Ich suche eine datenbankgesteuerte Atomkontrolle update-if-found-else-insert-Vorgang (ein UPSERT).
INSERT .. ON DUPLICATE KEY UPDATE
tut dies das.
Tags und Links jpa concurrency upsert pessimistic-locking