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!