2010-09-30 9 views
8

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?

+0

Hallo Laird. Hattest du Gelegenheit, daran zu arbeiten? Irgendwelche interessanten Ergebnisse? –

+0

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. –

+1

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. –

Antwort

4

Ich bin auf der Suche nach einer datenbankgesteuerten atomaren update-if-found-else-insert-Operation (ein UPSERT).

Ich beantworte vielleicht nicht gerade die ganze Frage, aber wenn Sie die oben ohne Race-Bedingung implementieren möchten, müssen 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.

2

ich diese Art von Situation konfrontiert und fand diese:

pessimistisches Sperren, bedeutet, dass Verriegelung von Objekten auf Transaktion beginnen und während der Transaktion die Sperre hält von diesem 2 PessimisticLockModes getan wird: - LockModeType.PESSIMISTIC_READ -> Einheit kann von anderen Transaktionen gelesen, aber keine Änderungen gemacht werden - LockModeType.PESSIMISTIC_WRITE -> Einheit kann nicht durch andere Transaktionen gelesen oder geschrieben werden

link zu dem Artikel