SPRING-JAVA hal-hal yang diproses kegagalan rollback baru-baru ini, saya sedang mengerjakan sebuah proyek dan secara tidak sengaja menemukan bahwa sebuah kelas melempar operasi rollback, dan data dimasukkan ke dalam database secara normal, jadi saya dengan hati-hati memeriksa dan melihat alasan spesifik.
Semuanya masih dimulai dengan pengecualian yang diperiksa Java dan pengecualian yang tidak diperiksa.
Jadi apa itu pengecualian tipe inspeksi dan apa itu pengecualian tipe non-inspeksi?
Ada dua poin penilaian paling sederhana:
1. Pengecualian yang tidak memeriksa yang diwarisi dari runtimeException atau kesalahan, sedangkan pengecualian pengecekan diwarisi dari pengecualian (tentu saja, runtimeException itu sendiri juga merupakan subclass dari pengecualian).
2. Pengecualian yang tidak diperiksa dapat ditangkap tanpa ditangkap, sementara pengecualian diperiksa harus diproses dengan cobalah ... tangkap blok pernyataan atau menyerahkan pengecualian kepada metode superior untuk diproses. Singkatnya, kode harus ditulis untuk memprosesnya.
Struktur pengecualian Java ditunjukkan pada gambar di bawah ini. Di antara mereka, pengecualian yang secara langsung mewarisi pengecualian harus ditangkap dan diperiksa pengecualian.
Mari kita lihat kembali kode saya:
1. Nama metode didahului oleh
@Transactional
2. File Konfigurasi Spring ApplicationContext-xxx.xml juga memiliki konfigurasi terkait untuk hal-hal pegas.
<bean id = "TransactionManager"> <name properti = "DataSource" ref = "DataSource"/> <name properti = "rollbackonCommitFailure" value = "true"> </property> </ bean>
Tetapi mengapa hal yang telah dikirimkan setelah mencoba ... Tangkap pengecualian pengecualian tidak digulung ketika metode lapisan layanan dipanggil?
Setelah memeriksa dokumentasi musim semi yang relevan, saya menemukan bahwa manajemen transaksi Deklaratif Musim Semi asli melakukan rollback transaksi pada pengecualian yang tidak diperiksa dan pengecualian runtime secara default, sementara tidak ada rollback pada pengecualian yang diperiksa.
Pengecualian yang dilemparkan oleh coba ... Tangkap dalam kode adalah pengecualian tipe cek. Kerangka kerja Spring tidak akan berputar kembali secara default.
Dalam pemrograman, pengecualian yang tidak diperiksa dapat dihindari, sementara pengecualian yang diperiksa harus diproses dengan blok pernyataan coba atau diserahkan ke metode superior untuk menanganinya. Singkatnya, kode harus ditulis untuk memprosesnya.
Oleh karena itu, pengecualian harus ditangkap dalam layanan dan kemudian secara manual melemparkan pengecualian yang tidak diperiksa lagi sehingga transaksi dapat berlaku. Misalnya:
coba {………} catch (Exception e) {……… lempar BusinessException baru (e.getMessage ()); }Tentu saja, kami memiliki cara yang lebih mudah untuk menyelesaikan masalah ini, yaitu mengubah metode rollback default dengan anotasi parameter.
Norollbackfor dan rollbackfor didefinisikan dalam anotasi @transaction untuk menentukan apakah pengecualian tertentu digulung kembali.
Gunakan contoh:
@Transaction (norollbackfor = runtimeException.class)
@Transaction (rollbackfor = exception.class)
Oleh karena itu, dalam pertanyaan di atas, Anda dapat secara langsung menambahkan parameter rollback @transaction (rollbackfor = exception.class), yang mengubah metode pemrosesan transaksi default.
Wahyu:
Ini mengharuskan kita untuk mewarisi pengecualian khusus dari runtimeException saat menyesuaikan pengecualian, sehingga ketika dilemparkan, itu akan ditangani secara akurat oleh pemrosesan transaksi default Spring.
Meringkaskan
Di atas adalah seluruh konten artikel ini tentang masalah kegagalan rollback transaksi java. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!