Ich habe this article on JPA concurrency gelesen, aber entweder bin ich zu dick oder es ist nicht explizit genug.Reicht LockModeType.PESSIMISTIC_WRITE für einen UPSERT in JPA aus?
Ich bin auf der Suche nach einer datenbankgesteuerten atomaren update-if-found-else-insert-Operation (ein UPSERT
).
Es sieht zu meinem armen langsamen Gehirn, die ich kann - innerhalb einer Transaktion natürlich - eine benannte Abfrage mit einem Lock-Modus von PESSIMISTIC_WRITE
laufen, sehen, ob es irgendwelche Ergebnisse zurückgibt, und dann entweder ein persist()
oder update()
danach.
Worauf ich nicht klar bin, sind die Unterschiede zwischen dieser Operation mit einer PESSIMISTIC_WRITE
Sperre gegenüber einer PESSIMISTIC_READ
Sperre. Ich habe die Sätze gelesen - ich verstehe, dass PESSIMISTIC_READ
soll nicht wiederholbare Lesevorgänge zu verhindern, und PESSIMISTIC_WRITE
ist ... nun, vielleicht verstehe ich das nicht so gut :-) - aber darunter ist nur ein SQL SELECT FOR UPDATE
, ja? In beiden Fällen?
Hallo Laird. Hattest du Gelegenheit, daran zu arbeiten? Irgendwelche interessanten Ergebnisse? –
Ich hatte nicht die Zeit zu graben und zu sehen, was eigentlich los ist. Ich legte eine PESSIMISTIC_WRITE-Sperre ein, weil der Nebenläufigkeitsartikel zu versuchen schien zu unterstellen, dass dies mir tatsächlich erlauben würde, einen race-condition-less UPSERT zu machen. Tangente: Ein UPSERT scheint eine so unglaublich häufige Operation zu sein, dass es einen Weg geben muss, dies in JPA zu tun. –
Ich habe das Gefühl, ich vermisse hier etwas. Warum können Sie nicht einfach find() + insert() einfügen, wenn nötig. Ich nehme an, die Transaktion wird die Atomarität garantieren? Ich denke, die Sperrung ist weniger wichtig, könnte man sogar optimistische Sperrung + Versionierung verwenden? Ich vermute, dass doppelte Einträge mit einer eindeutigen Einschränkung geschützt werden. –