Rumah > Java > javaTutorial > Mengapa Kaedah @Transactional Gagal Apabila Dipanggil Sendiri Dalam Kelas Yang Sama pada Musim Bunga?

Mengapa Kaedah @Transactional Gagal Apabila Dipanggil Sendiri Dalam Kelas Yang Sama pada Musim Bunga?

Linda Hamilton
Lepaskan: 2024-12-19 04:47:09
asal
379 orang telah melayarinya

Why Do @Transactional Methods Fail When Self-Invoked Within the Same Class in Spring?

Isu Invokasi Kaedah Transaksi dalam Kelas Yang Sama

Masalah:

Pada Musim Bunga, cuba menggunakan kaedah beranotasi dengan @Transaksi dari dalam kelas yang sama boleh mengakibatkan tidak berkesan transaksi.

Contoh Kod:

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);
        }
    }
}
Salin selepas log masuk

Memahami Isu:

Isu ini timbul disebabkan oleh pengehadan pada Musim Bunga Pengendalian objek dinamik AOP dan penggunaan cglib. Mekanisme pengendalian transaksi lalai Spring menggunakan proksi dinamik yang dibuat dengan cglib, yang boleh menyebabkan ketidakkonsistenan apabila memanggil kaedah transaksi dari dalam kelas yang sama.

Penyelesaian:

Menggunakan AspectJ untuk Pengendalian Transaksi:

Untuk menyelesaikan masalah ini, anda boleh konfigurasikan Spring untuk menggunakan AspectJ untuk mengendalikan transaksi. Ini melibatkan:

  • Menetapkan mod kepada aspectj dalam tx:anotation-driven:

    <tx:annotation-driven mode="aspectj"/>
    Salin selepas log masuk
  • Menambah konfigurasi kacang berikut (hanya untuk Versi musim bunga di bawah 3.0):

    <bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf">
      <property name="transactionManager" ref="transactionManager"/>
    </bean>
    Salin selepas log masuk

Pemfaktoran Semula:

Penyelesaian alternatif ialah memfaktorkan semula kod anda. Daripada menggunakan kaedah transaksi dari dalam kelas yang sama, pertimbangkan untuk membuat kelas berasingan untuk pengendalian dan pemprosesan pengguna untuk mendayakan pengendalian transaksi lalai menggunakan Spring AOP.

Atas ialah kandungan terperinci Mengapa Kaedah @Transactional Gagal Apabila Dipanggil Sendiri Dalam Kelas Yang Sama pada Musim Bunga?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan