Ist LockModeType.PESSIMISTIC_WRITE ausreichend für einen UPSERT in JPA?

8

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?

    
Laird Nelson 30.09.2010, 18:52
quelle

3 Antworten

4
  

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.

    
Pascal Thivent 30.09.2010 20:17
quelle
2

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

    
Elbek 20.02.2013 22:52
quelle
0
  

Ich suche eine datenbankgesteuerte Atomkontrolle   update-if-found-else-insert-Vorgang (ein UPSERT).

INSERT .. ON DUPLICATE KEY UPDATE tut dies das.

    
Rick James 30.04.2017 18:15
quelle