Heim >Java >javaLernprogramm >Warum schlagen Spring-Transaktionen fehl, wenn sie innerhalb derselben Klasse aufgerufen werden?
In Spring werden Transaktionsmethoden normalerweise mit @Transaction annotiert. Wenn eine Transaktionsmethode aufgerufen wird, verwaltet Spring automatisch den Transaktionslebenszyklus und stellt so die Datenintegrität auch bei Ausnahmen sicher. Allerdings tritt ein unerwartetes Verhalten auf, wenn eine Transaktionsmethode innerhalb derselben Klasse aufgerufen wird. Die Transaktion scheint umgangen zu werden, sodass sich die Entwickler den Kopf zerbrechen.
Spring verwendet dynamische Proxys (wie CGLIB), um Methodenaufrufe abzufangen und Transaktionsverhalten anzuwenden. Wenn jedoch eine Transaktionsmethode eine andere Transaktionsmethode innerhalb derselben Klasse aufruft, wird der dynamische Proxy umgangen. Dies liegt daran, dass das Zielobjekt in beiden Fällen dasselbe ist und der Proxy nur für externe Methodenaufrufe erstellt wird.
Um dieses Problem zu lösen, haben Sie Folgendes getan zwei Optionen:
Um AspectJ für die Transaktionsabwicklung zu konfigurieren, Befolgen Sie diese Schritte:
Fügen Sie für Spring-Versionen vor 3.0 auch die folgende Bean-Definition zu Ihrer Konfiguration hinzu:
<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf"> <property name="transactionManager" ref="transactionManager" /> </bean>
Durch die Einbeziehung von AspectJ oder Durch die Umgestaltung Ihres Codes können Sie die Einschränkungen der standardmäßigen Transaktionsverarbeitung von Spring überwinden und ein konsistentes Transaktionsverhalten sicherstellen, selbst für verschachtelte Aufrufe innerhalb derselben Klasse.
Das obige ist der detaillierte Inhalt vonWarum schlagen Spring-Transaktionen fehl, wenn sie innerhalb derselben Klasse aufgerufen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!