Rumah >Java >javaTutorial >Mengapa Transaksi Musim Bunga Gagal Apabila Dipanggil Dalam Kelas Yang Sama?

Mengapa Transaksi Musim Bunga Gagal Apabila Dipanggil Dalam Kelas Yang Sama?

Barbara Streisand
Barbara Streisandasal
2024-12-20 06:09:10458semak imbas

Why Do Spring Transactions Fail When Called Within the Same Class?

Panggilan Urus Niaga Dalam Kelas Yang Sama: Dilema Musim Bunga

Masalahnya

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.

Punca: Had Proksi Dinamik

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.

Penyelesaian: Memeluk AspekJ atau Pemfaktoran Semula

Untuk menyelesaikan isu ini, anda perlu dua pilihan:

  1. Konfigurasikan AspectJ: Spring menyediakan mod pengendalian transaksi alternatif yang menggunakan AspekJ. Dengan menetapkan atribut mod kepada aspectj dalam anotasi @TransactionManagement anda, Spring akan menggunakan AspectJ untuk mengurus transaksi. Ini membolehkan panggilan transaksi dalam kelas yang sama berfungsi seperti yang diharapkan.
  2. Kod Refactor: Walaupun AspectJ menawarkan penyelesaian, ia mungkin bukan pendekatan yang paling elegan. Alternatif yang lebih bersih ialah memfaktorkan semula kod anda untuk memisahkan operasi transaksi ke dalam kelas yang berbeza. Dengan mempunyai kelas khusus mengendalikan setiap operasi transaksi, anda boleh mengelakkan masalah panggilan transaksi bersarang dalam kelas yang sama.

Petua Konfigurasi untuk AspectJ

Untuk mengkonfigurasi AspectJ untuk pengendalian transaksi, ikut langkah berikut:

  • Tambah pada konfigurasi Spring anda.
  • 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!

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