Rumah >Java >javaTutorial >Mengapa Spring @Transactional Annotation Saya Tidak Berfungsi Apabila Memanggil Kaedah dari Dalam Kelas Yang Sama?
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!