Dies ist verwandt mit my last questionKann die JPA executeUpdate eine Zeile unbegrenzt sperren?
Ich habe eine PESSIMISTIC_WRITE Sperre in meiner Anwendung implementiert, um Datenprobleme bei gleichzeitig laufenden Prozeduren zu vermeiden.
Das Problem ist sogar mit diesem und die Variable INNODB_LOCK_WAIT_TIMEOUT auf 120 gesetzt Ich habe immer noch Deadlocks.
Ich überprüfe die Quelle (ich bin neu in diesem Projekt) und die Art, wie wir eine Zeile mit JPA aktualisieren ist anders als ich es gewohnt bin.
Wir verwenden eine typisierte Abfrage eine Reihe dh
TypedQuery<Account> q = em.createQuery("UPDATE Account a SET a.balance=a.balance+:quantity",Account.class);
q.setParameter("quantity",100);
q.executeUpdate();
return;
zu aktualisieren Was meine Aufmerksamkeit bekommt, ist es nicht eine ist verpflichten, fusionieren, bündig oder etwas, das mir Methode, die ich bin Abschluss der Transaktion wie der Zusammenführung gewährleistet aus dem EntityManager.
Unordnung machen Sie Transaktionen verwenden - ich hoffe es. –
Leider sehe ich keine Transaktionsannotation in der Methode, die die Zeile aktualisiert. Ich wiederhole das ist nicht mein Code Ich bin gewohnt, die EntityManager-Methoden wie Persist, Merge, Refresh usw. zu verwenden. – Rafihna
Ein executeUpdate-Aufruf führt zu einer Ausnahme, wenn er außerhalb einer Transaktion ausgeführt wird. Also muss der Anruf innerhalb einer Transaktion getätigt werden. Das pessmistische Sperren wird normalerweise bei Lesevorgängen durchgeführt, sodass Sie im Voraus wissen und darauf warten können, dass andere Sperren abgeschlossen werden, bevor Sie mit Ihren Sperren fortfahren. Wenn Sie einen Deadlock erhalten, müssen Sie die Zeilen anzeigen, die Sie gesperrt haben, und die Zeilen, die der andere Prozess gesperrt hat, und die Reihenfolge ändern, in der sie diese Sperren erhalten. Sie brauchen viel mehr Informationen als diese eine Methode. – Chris