Rumah >Java >javaTutorial >Mengapa Spring @Transactional Annotation Saya Tidak Berfungsi Apabila Memanggil Kaedah dari Dalam Kelas Yang Sama?

Mengapa Spring @Transactional Annotation Saya Tidak Berfungsi Apabila Memanggil Kaedah dari Dalam Kelas Yang Sama?

Susan Sarandon
Susan Sarandonasal
2024-12-27 10:25:24841semak imbas

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

Transaksi Musim Bunga: Mengendalikan Panggilan Kaedah dalam Kelas Yang Sama

Apabila menganotasi kaedah dengan @Transactional untuk mengendalikan transaksi, tingkah laku yang tidak dijangka mungkin timbul apabila memanggil kaedah itu dari dalam kelas yang sama. Urus niaga mungkin tidak digunakan seperti yang dijangkakan.

Untuk menyelesaikan isu ini, adalah penting untuk memahami bahawa Spring menggunakan AOP (Aspect-Oriented Programming) untuk melaksanakan pengurusan transaksi secara lalai. Apabila menggunakan CGLIB untuk AOP (yang merupakan lalai), ia mencipta contoh proksi untuk kelas beranotasi. Ini bermakna apabila kaedah dipanggil dari dalam kelas yang sama, ia berinteraksi dengan contoh proksi dan bukannya kelas asal, menyebabkan transaksi tidak digunakan.

Penyelesaian: Dayakan AspectJ untuk Pengurusan Transaksi.

Untuk mengatasi had ini, anda boleh mendayakan AspectJ untuk pengurusan transaksi dalam konfigurasi Spring anda dengan menambah yang berikut kod:

<tx:annotation-driven mode="aspectj"/>

Dengan mengkonfigurasi AspectJ, Spring akan menggunakan AspectJ untuk mengurus transaksi, yang akan menyelesaikan isu panggilan kaedah dalam kelas yang sama.

Pendekatan Alternatif: Kod Refactor

Jika anda memilih untuk tidak menggunakan AspectJ, pendekatan alternatif ialah memfaktorkan semula kod anda dan memisahkan pengendalian transaksi ke dalam kelas atau perkhidmatan yang berbeza. Dengan berbuat demikian, kaedah transaksi beranotasi boleh dipanggil daripada kelas berasingan dan transaksi akan digunakan dengan betul.

Sebagai contoh, pertimbangkan kod berikut:

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...
    }
}

Dalam kes ini , kaedah transaksional addUser ditakrifkan dalam kelas pembantu dan kelas UserService memanggil kaedah ini. Urus niaga akan digunakan dengan betul dalam senario ini.

Atas ialah kandungan terperinci Mengapa Spring @Transactional Annotation Saya Tidak Berfungsi Apabila Memanggil Kaedah dari Dalam Kelas Yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn