Spring Transaction: Methodenaufrufe innerhalb derselben Klasse verarbeiten
Beim Annotieren einer Methode mit @Transactional zur Verarbeitung von Transaktionen kann ein unerwartetes Verhalten auftreten wenn diese Methode innerhalb derselben Klasse aufgerufen wird. Die Transaktion wird möglicherweise nicht wie erwartet angewendet.
Um dieses Problem zu beheben, ist es wichtig zu verstehen, dass Spring AOP (Aspect-Oriented Programming) verwendet, um die Transaktionsverwaltung standardmäßig zu implementieren. Wenn CGLIB für AOP verwendet wird (was die Standardeinstellung ist), wird eine Proxy-Instanz für die mit Anmerkungen versehene Klasse erstellt. Das heißt, wenn eine Methode innerhalb derselben Klasse aufgerufen wird, interagiert sie mit der Proxy-Instanz statt mit der ursprünglichen Klasse, was dazu führt, dass die Transaktion nicht angewendet wird.
Lösung: Aktivieren Sie AspectJ für die Transaktionsverwaltung
Um diese Einschränkung zu überwinden, können Sie AspectJ für die Transaktionsverwaltung in Ihrer Spring-Konfiguration aktivieren, indem Sie Folgendes hinzufügen Code:
<tx:annotation-driven mode="aspectj"/>
Durch die Konfiguration von AspectJ verwendet Spring AspectJ zum Verwalten von Transaktionen, wodurch das Problem von Methodenaufrufen innerhalb derselben Klasse gelöst wird.
Alternativer Ansatz: Refactor-Code
Wenn Sie AspectJ lieber nicht verwenden möchten, besteht ein alternativer Ansatz darin, Ihren Code umzugestalten und die Transaktionsverarbeitung in einen zu trennen andere Klasse oder Dienst. Auf diese Weise kann die annotierte Transaktionsmethode aus der separaten Klasse aufgerufen werden und die Transaktion wird korrekt angewendet.
Betrachten Sie beispielsweise den folgenden Code:
public class UserService { private UserServiceHelper helper; public boolean addUser(String userName, String password) { return helper.addUser(userName, password); } } public class UserServiceHelper { @Transactional public boolean addUser(String userName, String password) { // Transactional logic... } }
In diesem Fall , die Transaktionsmethode addUser ist in einer Hilfsklasse definiert und die UserService-Klasse ruft diese Methode auf. Die Transaktion wird in diesem Szenario korrekt angewendet.
Das obige ist der detaillierte Inhalt vonWarum funktioniert meine Spring @Transactional-Annotation nicht, wenn eine Methode aus derselben Klasse aufgerufen wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!