Rumah > Java > javaTutorial > Mengapa @Transactional Tidak Berfungsi Apabila Memanggil Kaedah Dalam Kelas Yang Sama pada Musim Bunga?

Mengapa @Transactional Tidak Berfungsi Apabila Memanggil Kaedah Dalam Kelas Yang Sama pada Musim Bunga?

Mary-Kate Olsen
Lepaskan: 2024-12-19 07:51:08
asal
366 orang telah melayarinya

Why Doesn't @Transactional Work When Calling a Method Within the Same Class in Spring?

Panggilan Kaedah @Transaksi Musim Bunga Dalam Kelas Yang Sama: Gelagat Tidak Dijangka

Pada Musim Bunga, anotasi seperti @Transaction membenarkan pembangun mengurus urus niaga dengan mudah. Walau bagaimanapun, isu pelik timbul apabila cuba memanggil kaedah transaksi (@Transaksional) dari dalam kelas yang sama yang ditakrifkan.

Secara khusus, pembangun mungkin menghadapi situasi di mana kaedah pemanggil dalam kelas yang sama yang memegang kaedah @Transactional gagal mencetuskan tingkah laku transaksi yang dijangkakan. Untuk menangani isu ini, mari kita teliti sebab asasnya.

CGLIB dan AspectJ

Mekanisme pengendalian transaksi lalai Spring menggunakan CGLIB untuk menjana dan meningkatkan kelas Java secara dinamik untuk mencipta proksi untuk Spring Beans. CGLIB, walau bagaimanapun, menghadapi had apabila mengendalikan invokasi kaedah dalam kelas yang sama. Akibatnya, apabila anda menggunakan kaedah @Transactional dari dalam kelas yang sama, CGLIB gagal memintas transaksi, menyebabkan ketiadaan gelagat transaksi.

Aspect-Oriented Programming (AOP)

Penyelesaian kepada isu ini terletak pada penggunaan Pengaturcaraan Berorientasikan Aspek (AOP) untuk mengendalikan transaksi. AOP membenarkan kami memintas dan mengubah suai tingkah laku program tanpa mengubah suai kod sumber itu sendiri.

Konfigurasi untuk AspectJ

Untuk mengkonfigurasi Spring menggunakan AspectJ bagi pengurusan transaksi, anda mesti menambah konfigurasi berikut:

<tx:annotation-driven mode="aspectj"/>
Salin selepas log masuk

Jika menggunakan versi Spring di bawah 3.0, anda mesti juga add:

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

Kod Pemfaktoran Semula

Satu lagi penyelesaian yang berdaya maju, terutamanya jika AOP tidak boleh dilaksanakan, adalah untuk memfaktorkan semula kod anda. Daripada menggunakan kaedah transaksi dari dalam kelas yang sama, buat kelas berasingan yang mewakilkan pengendalian transaksi kepada kaedah transaksi. Pendekatan ini memastikan mekanisme pengendalian transaksi lalai Spring berfungsi dengan betul.

Atas ialah kandungan terperinci Mengapa @Transactional Tidak Berfungsi Apabila Memanggil Kaedah 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