Hibernate löst org.hibernate.exception.LockAcquisitionException aus

9

Ich habe diese Methode:

%Vor%

Zuordnung:

Person.hbm.xml

%Vor%

Cars.hbm.xml

%Vor%

Diese Methode funktioniert gut für einen einzelnen Thread und bei mehreren Threads gibt es einen Fehler:

%Vor%

AOP-Transaktion:

%Vor%

Hinweis: Wenn ich Thread.sleep (5000) nach dem Update hinzufüge, ist es in Ordnung. Aber diese Lösung ist nicht sauber.

    
Abdelhafid 02.08.2014, 18:06
quelle

2 Antworten

0

Ich habe Autos - & gt; (1 -n) Orte. Und ich habe einen Fremdschlüssel am Tischplatz (id_car). Dieser Fremdschlüssel hat keinen Index. Wenn ich diesem Fremdschlüssel einen Index hinzufüge, ist mein Problem gelöst.

Siehe auch: Suche nach einem Deadlock-Fehler von Oracle Trace Datei

    
Abdelhafid 03.08.2014, 13:39
quelle
4

Lassen Sie uns zuerst die folgenden Hibernate-Eigenschaften festlegen:

%Vor%

Zweitens sollte die Abfolge der Operationen entsprechend Ihrer Zuordnung wie folgt aussehen:

%Vor%

Eine Aktualisierung oder ein Löschen bedeutet, dass eine exklusive Sperre erworben wird, selbst auf der Isolationsstufe READ_COMMITTED. Wenn eine andere Transaktion die gleiche Zeile mit der aktuellen laufenden Transaktion aktualisieren möchte (die diese fragliche Zeile bereits gesperrt hat), erhalten Sie eine Dead-Lock-, aber eine Lock-Acquisition-Timeout-Ausnahme.

Da Sie eine Dead-Lock-Funktion erhalten haben, bedeutet dies, dass Sie Locks für mehrere Tabellen erhalten und die Lock-Acquisitions nicht ordnungsgemäß geordnet sind.

Stellen Sie also sicher, dass Ihr Dienst die Transaktionsgrenzen und nicht die Dao-Methoden sind. Ich sehe, dass Sie die Methoden get und find für die Verwendung von SUPPORTED deklariert haben, was bedeutet, dass sie nur dann eine Transaktion verwenden, wenn sie gerade gestartet wird. Ich denke, Sie sollten auch für diese REQUIRED verwenden, aber markieren Sie sie einfach als readonly = true.

Stellen Sie also sicher, dass der Transaktionsaspekt die Transaktionsgrenze auf die "mymethod" und nicht auf die DAO-Methode anwendet.

    
Vlad Mihalcea 02.08.2014 20:48
quelle