Problem:
Im Frühjahr wurde versucht, eine mit annotierte Methode aufzurufen @Transaction innerhalb derselben Klasse kann zu einer ineffektiven Transaktion führen.
Code Beispiel:
public class UserService { @Transactional public boolean addUser(String userName, String password) { // ... } public boolean addUsers(List<User> users) { for (User user : users) { addUser(user.getUserName, user.getPassword); } } }
Verstehen des Problems:
Dieses Problem entsteht aufgrund von Einschränkungen bei der dynamischen Objektverarbeitung von Spring AOP und der Verwendung von cglib. Der standardmäßige Transaktionsverarbeitungsmechanismus von Spring verwendet mit cglib erstellte dynamische Proxys, die beim Aufruf einer Transaktionsmethode innerhalb derselben Klasse zu Inkonsistenzen führen können.
Lösung:
Verwenden von AspectJ für die Transaktionsverarbeitung:
Um dieses Problem zu beheben, können Sie Spring für die Verwendung konfigurieren AspectJ zur Abwicklung von Transaktionen. Dies beinhaltet:
Einstellen des Modus auf „aspectj“ in tx:annotation-driven:
<tx:annotation-driven mode="aspectj"/>
Hinzufügen der folgenden Bean-Konfiguration (nur für Frühlingsversionen unten 3.0):
<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf"> <property name="transactionManager" ref="transactionManager"/> </bean>
Refactoring:
Eine alternative Lösung besteht darin, Ihren Code umzugestalten. Anstatt die Transaktionsmethode innerhalb derselben Klasse aufzurufen, sollten Sie erwägen, separate Klassen für die Benutzerhandhabung und -verarbeitung zu erstellen, um die Standardtransaktionshandhabung mit Spring AOP zu ermöglichen.
Das obige ist der detaillierte Inhalt vonWarum schlagen @Transactional-Methoden fehl, wenn sie im Frühjahr innerhalb derselben Klasse selbst aufgerufen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!