2017-10-17 3 views
2

Ich habe eine Java-Methode in der Transaktion ausgeführt, wo ich eine Oracle-Datenbank-Tabelle mit folgenden JPA-Abfrage lesen und dann einen neuen Datensatz in der gleichen Tabelle mit dem Ergebnis der folgenden Abfrage einfügen. Ich möchte verstehen, wie der Sperrmodus PESSIMISTIC_WRITE in diesem Szenario funktioniert. Wird die gesamte Tabelle gesperrt, wenn die folgende Abfrage ausgeführt wird und andere Lesevorgänge aus dieser Tabelle blockiert werden, bis meine Methode die Transaktion nach dem Einfügen festschreibt?JPA Lock Mode Verhalten

@NamedQuery(name = "findByMaxSeqForGivenOrd", query = "select ar from Remark ar 
where ar.sequenceNumber = (select max(ar1.remarkId.sequenceNumber) from Remark ar1 
where ar1.remarkId.orderNum = ar.remarkId.orderNum 
AND ar1.remarkId.orderNum=:orderNum)", 
lockMode=LockModeType.PESSIMISTIC_WRITE, 
hints = @QueryHint(name = "javax.persistence.lock.timeout", value = 
"3000")) 

Antwort

0

Wenn Sie LockModeType.PESSIMISTIC_WRITE auf einer Abfrage verwenden, dann würden Sie ein Äquivalent Serializable Isolationsstufe auf oracle db Zugabe am Ende.

Auf der Datenbankebene nur die Zeilen zu dem Ergebnis Einheiten entsprechen, wird mit wenigen Dingen gesperrt werden, zu berücksichtigen:

für die
  • Entity Beziehungen die verriegelte Einheit des Fremdschlüssel enthält, werden auch gesperrt werden, aber nicht den Status der referenzierten Entitäten (sofern diese Entitäten nicht explizit gesperrt sind).

  • ElementCollections und Beziehungen, für die die Entität den Fremdschlüssel nicht enthält: @OneToMany, @ManyToMany; wird standardmäßig nicht gesperrt.

  • ElementCollections und und durch das Unternehmen im Besitz Beziehungen, die in den Join-Tabellen enthalten sind, wird, wenn die Eigenschaft mit einem Wert PessimisticLockScope.EXTENDED angegeben ‚javax.persistence.lock.scope‘ gesperrt werden.

+0

Danke. Wenn meine Tabelle also die Spalten orderNum und seqNum sowie drei Datensätze (1, 1), (1, 2), (2, 1) enthält, verwende ich die Abfrage in der Originalfrage, um den Datensatz mit max (seqNum) für orderNum 1 zu finden , die zurückgeben würde (1, 2), dann wird für diesen Fall eine andere Transaktion, die dieselbe Abfrage für orderNum 1 ausführt, warten, bis die erste Transaktion festgeschrieben wird? Was ist mit Einlage? Können andere Transaktionen neue Zeilen für dieselbe OrderNum: 1 einfügen? – ppatidar

+0

t2 wird abhängig von der Timeout-Einstellung warten .. und Sie können keine neue Zeile mit dem gleichen pk trotzdem einfügen –

+0

Es tut mir leid. Ich meinte Einlage mit verschiedenen PK. Das Lesen, das ich mache, ist, die neue Sequenznummer zu erzeugen. Ich habe eine vorhandene Tabelle, wo OrderNum und SeqNum Teil von PK sind. SeqNum wird für einen neuen Auftrag auf 1 zurückgesetzt. Auf diese Tabelle wird derzeit vom Pro * c-Code zugegriffen, und jetzt muss ich JPA verwenden. Ich konnte keine PK-Erzeugungsstrategie finden, die ich in diesem Fall verwenden kann. – ppatidar