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
Linda Hamiltonasal
2024-12-19 04:47:09394semak imbas

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);
        }
    }
}

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"/>
  • 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>

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!

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