Heim > Java > javaLernprogramm > Warum funktioniert meine Spring @Transactional-Annotation nicht, wenn eine Methode aus derselben Klasse aufgerufen wird?

Warum funktioniert meine Spring @Transactional-Annotation nicht, wenn eine Methode aus derselben Klasse aufgerufen wird?

Susan Sarandon
Freigeben: 2024-12-27 10:25:24
Original
843 Leute haben es durchsucht

Why Doesn't My Spring @Transactional Annotation Work When Calling a Method from Within the Same Class?

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"/>
Nach dem Login kopieren

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...
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage