In Spring ermöglichen Annotationen wie @Transaction Entwicklern die mühelose Verwaltung von Transaktionen. Es tritt jedoch ein besonderes Problem auf, wenn versucht wird, eine Transaktionsmethode (@Transactional) aus derselben Klasse aufzurufen, in der sie definiert ist.
Insbesondere kann ein Entwickler auf eine Situation stoßen, in der eine aufrufende Methode innerhalb derselben Klasse, die sie enthält, aufgerufen wird Eine @Transactional-Methode löst nicht das erwartete Transaktionsverhalten aus. Um dieses Problem anzugehen, wollen wir uns mit der zugrunde liegenden Ursache befassen.
Der standardmäßige Transaktionsverarbeitungsmechanismus von Spring verwendet CGLIB, um Java-Klassen dynamisch zu generieren und zu erweitern, um Proxys für Spring Beans zu erstellen. CGLIB stößt jedoch bei der Verarbeitung von Methodenaufrufen innerhalb derselben Klasse auf Einschränkungen. Wenn Sie daher eine @Transactional-Methode innerhalb derselben Klasse aufrufen, kann CGLIB die Transaktion nicht abfangen, was dazu führt, dass kein Transaktionsverhalten auftritt.
Die Lösung für dieses Problem liegt in der Nutzung der aspektorientierten Programmierung (AOP) zur Abwicklung von Transaktionen. Mit AOP können wir das Programmverhalten abfangen und ändern, ohne den Quellcode selbst zu ändern.
Um Spring für die Verwendung von AspectJ für die Transaktionsverwaltung zu konfigurieren, müssen Sie die folgende Konfiguration hinzufügen:
<tx:annotation-driven mode="aspectj"/>
Wenn Sie Spring-Versionen unter 3.0 verwenden, müssen Sie dies auch tun hinzufügen:
<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf"> <property name="transactionManager" ref="transactionManager"/> </bean>
Eine weitere praktikable Lösung, insbesondere wenn AOP nicht umsetzbar ist, besteht darin, Ihren Code umzugestalten. Anstatt die Transaktionsmethode innerhalb derselben Klasse aufzurufen, erstellen Sie eine separate Klasse, die die Transaktionsverarbeitung an die Transaktionsmethode delegiert. Dieser Ansatz stellt sicher, dass der standardmäßige Transaktionsverarbeitungsmechanismus von Spring ordnungsgemäß funktioniert.
Das obige ist der detaillierte Inhalt vonWarum funktioniert @Transactional nicht, wenn im Frühjahr eine Methode innerhalb derselben Klasse aufgerufen wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!