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"))
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
t2 wird abhängig von der Timeout-Einstellung warten .. und Sie können keine neue Zeile mit dem gleichen pk trotzdem einfügen –
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