Pada Musim Bunga, kaedah transaksi biasanya dianotasi dengan @Transaction. Apabila kaedah transaksi digunakan, Spring mengurus kitaran hayat transaksi secara automatik, memastikan integriti data dalam menghadapi pengecualian. Walau bagaimanapun, tingkah laku yang tidak dijangka timbul apabila kaedah transaksi dipanggil dari dalam kelas yang sama. Transaksi itu nampaknya dipintas, menyebabkan pembangun menggaru kepala.
Spring menggunakan proksi dinamik (seperti CGLIB) untuk memintas panggilan kaedah dan menggunakan gelagat transaksi. Walau bagaimanapun, apabila kaedah transaksi memanggil kaedah transaksi lain dalam kelas yang sama, proksi dinamik dipintas. Ini kerana objek sasaran adalah sama dalam kedua-dua kes dan proksi hanya dicipta untuk penyebutan kaedah luaran.
Untuk menyelesaikan isu ini, anda perlu dua pilihan:
Untuk mengkonfigurasi AspectJ untuk pengendalian transaksi, ikut langkah berikut:
Untuk versi Spring sebelum 3.0, tambah juga definisi kacang berikut pada konfigurasi anda:
<bean class="org.springframework.transaction.aspectj.AnnotationTransactionAspect" factory-method="aspectOf"> <property name="transactionManager" ref="transactionManager" /> </bean>
Dengan memeluk AspectJ atau memfaktorkan semula kod anda, anda boleh mengatasi had pengendalian transaksi lalai Spring dan memastikan tingkah laku transaksi yang konsisten, walaupun untuk panggilan bersarang dalam masa yang sama kelas.
Atas ialah kandungan terperinci Mengapa Transaksi Musim Bunga Gagal Apabila Dipanggil Dalam Kelas Yang Sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!