Panduan Pengurusan Transaksi di Jawa dan Rangka Kerja Spring
Aug 01, 2025 am 06:25 AMSpring's @transactional hanya menggulung kembali untuk RuntimeException secara lalai. 2. Adalah perlu untuk menentukan bahawa pengecualian juga dilancarkan melalui rollbackfor. 3. Tingkah laku penyebaran yang diperlukan adalah nilai lalai. Memerlukan_new akan menggantung transaksi semasa. 4. Panggilan diri akan menyebabkan urus niaga gagal disebabkan kegagalan proksi. 5. Adalah disyorkan untuk menggunakan urus niaga deklaratif di lapisan perkhidmatan dan mengekalkan urus niaga pendek untuk meningkatkan prestasi. Akhirnya, tingkah laku urus niaga perlu disahkan melalui ujian untuk memastikan konsistensi data.
Menguruskan urus niaga dengan betul adalah kejam untuk mengekalkan integriti data dalam aplikasi Java, terutamanya ketika bekerja dengan pangkalan data. Dalam aplikasi perusahaan, urus niaga biasanya melibatkan pelbagai operasi yang mesti berjaya -atau, jika ada yang gagal, segala -galanya mesti dilancarkan kembali untuk mengekalkan konsistensi. Java dan Rangka Kerja Spring menyediakan alat yang berkuasa untuk mengendalikan pengurusan urus niaga dengan berkesan. Berikut adalah panduan praktikal untuk memahami dan melaksanakan pengurusan transaksi di Java dan Spring.

1. Apakah Pengurusan Transaksi?
Urus niaga adalah urutan operasi yang dilakukan sebagai unit kerja logik tunggal. Ia mesti memenuhi sifat asid:
- Atomicity : Semua operasi dalam transaksi berjaya atau gagal bersama -sama.
- Konsistensi : Pangkalan data kekal dalam keadaan yang konsisten sebelum dan selepas transaksi.
- Pengasingan : Urus niaga serentak tidak mengganggu satu sama lain.
- Ketahanan : Setelah dilakukan, perubahan kekal.
Di Java, pengurusan urus niaga boleh dikendalikan sama ada secara programatik (dengan kawalan eksplisit) atau deklaratif (menggunakan anotasi atau konfigurasi), dengan musim bunga yang memihak kepada yang terakhir.

2. Pengurusan Transaksi di Java Plain (JDBC)
Sebelum musim bunga, JDBC mentah biasanya digunakan, di mana urus niaga diuruskan secara manual menggunakan objek Connection
.
Sambungan conn = datasource.getConnection (); Cuba { conn.setAutocommit (false); // Mula transaksi // melaksanakan operasi db jdbctemplate.update ("Kemas kini akaun set baki = baki -? Where id =?", 100, 1); jdbctemplate.update ("Kemas kini akaun set baki = baki? Di mana id =?", 100, 2); conn.commit (); // komit jika semua berjaya } menangkap (pengecualian e) { conn.rollback (); // rollback atas kesilapan membuang e; } akhirnya { conn.setautocommit (true); conn.close (); }
Isu dengan Transaksi JDBC Manual :

- Rawan ralat (mudah dilupakan rollback atau tutup).
- Kod boilerplate.
- Sukar untuk mengekalkan dan menguji.
Di sinilah abstraksi Spring menjadi berharga.
3. Abstraksi Transaksi Spring
Spring menyediakan model urus niaga yang konsisten yang menyokong kedua -dua pengaturcaraan dan pengurusan transaksi deklaratif , menghilangkan API transaksi yang mendasari (JDBC, JPA, JTA, dll.).
Komponen utama:
-
PlatformTransactionManager
: antara muka teras (misalnya,DataSourceTransactionManager
,JpaTransactionManager
). -
@Transactional
: Anotasi untuk penandaan transaksi deklaratif. -
TransactionTemplate
: Untuk kawalan programatik.
4. Pengurusan Transaksi Deklaratif dengan @Transactional
Ini adalah pendekatan yang paling biasa dan disyorkan pada musim bunga.
Langkah 1: Dayakan pengurusan transaksi
Tambah @EnableTransactionManagement
ke kelas konfigurasi anda (biasanya tidak diperlukan dalam boot musim bunga, kerana ia dikonfigurasi auto).
@Configuration @EnableTransactionManagement Transaksi Kelas Awam Konfigurasi { @Bean platform awamTransactionManager TransactionManager (DataSource DataSource) { kembali DataSourCetRansActionManager baru (DataSource); } }
Langkah 2: Gunakan @Transactional
pada kaedah perkhidmatan
@Service Bankservice kelas awam { @Autowired Jdbctemplate swasta jdbctemplate; @Transactional public void TransferMoney (Long FromID, Long Toid, Double Amaun) { jdbctemplate.update ("Kemas kini akaun set baki = baki -? di mana id =?", amaun, dari id); jdbctemplate.update ("Kemas kini akaun set baki = baki? Where id =?", Amaun, toid); // Sekiranya pengecualian berlaku, kedua -dua kemas kini dilancarkan } }
Bagaimana ia berfungsi:
- Spring mencipta proksi di sekitar kacang
BankService
. - Apabila
transferMoney()
dipanggil, proksi memulakan transaksi. - Jika kaedah selesai secara normal → transaksi dilakukan.
- Sekiranya pengecualian yang diperiksa atau tidak terkawal dilemparkan → Transaksi Rolls kembali (secara lalai, hanya untuk pengecualian yang tidak terkawal).
5. Memahami tingkah laku @Transactional
@Transactional
mempunyai beberapa atribut dengan tingkah laku yang baik:
Atribut | Tujuan |
---|---|
propagation | Mentakrifkan bagaimana urus niaga harus berkelakuan jika seseorang sudah wujud (contohnya, REQUIRED , REQUIRES_NEW ). |
isolation | Menetapkan tahap pengasingan (misalnya, READ_COMMITTED , SERIALIZABLE ). |
rollbackFor | Tentukan pengecualian yang mencetuskan rollback (misalnya, rollbackFor = Exception.class ). |
noRollbackFor | Pengecualian yang tidak boleh mencetuskan rollback. |
readOnly | Mengoptimumkan operasi baca sahaja (contohnya, pertanyaan). |
Contoh: Rollback pada pengecualian yang diperiksa
Secara lalai, Spring hanya menggulung kembali untuk pengecualian yang tidak terkawal (subclass RuntimeException
). Untuk memasukkan pengecualian yang diperiksa:
@Transactional (rollbackfor = exception.class) public void TransferMoney (rentetan, rentetan ke, jumlah ganda) melemparkan ioException { // logik perniagaan jika (jumlah <= 0) membuang ioException baru ("jumlah tidak sah"); }
Sekarang, IOException
akan mencetuskan pengembalian semula.
6. Tingkah laku penyebaran: mengendalikan panggilan bersarang
Salah satu aspek yang paling disalahpahami ialah penyebaran transaksi .
Nilai Biasa:
-
REQUIRED
(lalai): Gunakan transaksi sedia ada, atau buat yang baru. -
REQUIRES_NEW
: Sentiasa menangguhkan transaksi semasa dan memulakan yang baru. -
SUPPORTS
: Jalankan dalam transaksi jika wujud, jika tidak transaksional.
Contoh: Menggunakan REQUIRES_NEW
@Service Kelas Public Paymentservice { @Autowired Auditservice Auditservice peribadi; @Transactional Processpayment void public () { // bahagian urus niaga luar jdbctemplate.update ("masukkan ke dalam pembayaran ..."); // Memulakan transaksi baru; Sekiranya ini gagal, luar masih boleh melakukan auditService.logPayment (); // Teruskan transaksi luar } } @Service Auditservice kelas awam { @Transactional (penyebaran = propagation.requires_new) public void logPayment () { jdbctemplate.update ("Masukkan ke dalam audit_log ..."); // walaupun ini gagal, pemprosesan pembayaran mungkin masih dilakukan } }
Penggunaan REQUIRES_NEW
dengan teliti -terutamanya jika anda memerlukan konsistensi yang kuat.
7. Perangkap biasa dan amalan terbaik
? Pencegahan diri memecahkan proksi
Jika kaedah dalam kelas yang sama memanggil kaedah @Transactional
secara langsung, urus niaga tidak digunakan kerana ia memintas proksi.
@Service kelas awam selfcallproblem { metoda void awam () { kaedahBB (); // Tiada transaksi! Panggilan langsung, tiada proksi } @Transactional kaedah void publicb () { // tidak transaksional apabila dipanggil dari metoda } }
? Betulkan : Suntikan perkhidmatan ke dalam logik sendiri atau reflektor.
? Amalan terbaik
- Sapukan
@Transactional
pada lapisan perkhidmatan , bukan DAO/repositori. - Pastikan urus niaga pendek dan fokus untuk mengurangkan pertarungan kunci.
- Lebih suka deklaratif atas pengurusan pengaturcaraan.
- Gunakan
readOnly = true
untuk kaedah pertanyaan untuk meningkatkan prestasi. - Berhati -hati dengan
REQUIRES_NEW
-it boleh menyebabkan kegagalan separa. - Ujian Tingkah Laku Transaksi Menggunakan
TestTransaction
dalam ujian integrasi.
8. Pengurusan Transaksi Programmatik (apabila anda memerlukan lebih banyak kawalan)
Kadang-kadang anda memerlukan kawalan halus. Gunakan TransactionTemplate
:
@Service kelas awam CustomTransactionService { @Autowired TransactionTemplate TransactionTemplate; public void processData () { TransactionTemplate.Execute (status -> { Cuba { jdbctemplate.update ("masukkan ke ..."); kembali benar; } menangkap (pengecualian e) { status.setrollBackOnly (); kembali palsu; } }); } }
Berguna untuk logik bersyarat atau apabila @Transactional
terlalu tegar.
9. Pengurusan Transaksi di Spring Boot
Spring Boot Auto-Configures Pengurusan Transaksi Jika ia mengesan:
-
DataSource
- Data Spring JPA atau serupa
Tambah sahaja:
<geterlihat> <groupId> org.springframework.boot </groupId> <stifactid> Spring-Boot-Starter-Data-JPA </artifactid> </ketergantungan>
Kemudian gunakan @Transactional
secara bebas -tidak ada persediaan tambahan yang diperlukan.
Pemikiran terakhir
Pengurusan Transaksi Spring sangat memudahkan bekerja dengan operasi yang mematuhi asid. Dengan menggunakan @Transactional
dengan bijak dan memahami penyebaran, pengasingan, dan peraturan rollback, anda boleh membina aplikasi yang mantap dan boleh dipelihara.
Kuncinya adalah:
- Gunakan transaksi deklaratif secara lalai.
- Faham bagaimana proksi berfungsi.
- Elakkan urus niaga jangka panjang.
- Kes -kes kelebihan ujian yang melibatkan pengecualian dan panggilan bersarang.
Dengan amalan ini, anda akan mengelakkan ketidakkonsistenan data biasa dan membina sistem yang lebih dipercayai.
Pada asasnya, biarkan Spring mengendalikan boilerplate -jadi anda boleh memberi tumpuan kepada logik perniagaan.
Atas ialah kandungan terperinci Panduan Pengurusan Transaksi di Jawa dan Rangka Kerja Spring. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Sebagai peneraju industri, Spring+AI menyediakan penyelesaian terkemuka untuk pelbagai industri melalui API yang berkuasa, fleksibel dan fungsi lanjutannya. Dalam topik ini, kami akan menyelidiki contoh aplikasi Spring+AI dalam pelbagai bidang Setiap kes akan menunjukkan cara Spring+AI memenuhi keperluan khusus, mencapai matlamat dan meluaskan LESSONSLEARNED ini kepada rangkaian aplikasi yang lebih luas. Saya harap topik ini dapat memberi inspirasi kepada anda untuk memahami dan menggunakan kemungkinan Spring+AI yang tidak terhingga dengan lebih mendalam. Rangka kerja Spring mempunyai sejarah lebih daripada 20 tahun dalam bidang pembangunan perisian, dan sudah 10 tahun sejak versi Spring Boot 1.0 dikeluarkan. Sekarang, tiada siapa boleh mempertikaikan Spring itu

Pengenalan API RESTful telah menjadi sebahagian daripada aplikasi WEB moden. Mereka menyediakan pendekatan piawai untuk mencipta dan menggunakan perkhidmatan Web, dengan itu meningkatkan kemudahalihan, kebolehskalaan dan kemudahan penggunaan. Dalam ekosistem Java, JAX-RS dan springmvc ialah dua rangka kerja yang paling popular untuk membina API RESTful. Artikel ini akan melihat secara mendalam kedua-dua rangka kerja, membandingkan ciri, kelebihan dan keburukannya untuk membantu anda membuat keputusan termaklum. JAX-RS: JAX-RSAPI JAX-RS (JavaAPI untuk Perkhidmatan Web RESTful) ialah JAX-RSAPI standard yang dibangunkan oleh JavaEE untuk membangunkan REST

Laluan Pembelajaran Backend: Perjalanan Eksplorasi dari Front-End ke Back-End sebagai pemula back-end yang berubah dari pembangunan front-end, anda sudah mempunyai asas Nodejs, ...

Saya ingin mengubah suai badan permintaan sebelum menghalakannya ke uri yang diberikan. Ubah suai kandungan berdasarkan dokumentasi yang saya gunakan org.springframework.cloud.gateway.filter.factory.rewrite.modifyrequestbodygatewayfilterfactory. Apabila memulakan pelayan saya, pelayan gagal bermula dengan sebab ralat berikut: Elemen [spring.cloud.gateway.routes[0].filters[0].modifyrequestbody.class] tidak terikat. \n\nOperasi:\

Mengoptimumkan pengelogan program: Petua untuk menetapkan tahap log log4j Ringkasan: Pengelogan program memainkan peranan penting dalam penyelesaian masalah, penalaan prestasi dan pemantauan sistem. Artikel ini akan berkongsi petua tentang menetapkan tahap log log4j, termasuk cara menetapkan tahap log yang berbeza dan cara menggambarkan proses tetapan melalui contoh kod. Pengenalan: Dalam pembangunan perisian, pembalakan adalah tugas yang sangat penting. Dengan merekodkan maklumat penting semasa proses menjalankan program, ia boleh membantu pembangun mengetahui punca masalah dan melakukan pengoptimuman prestasi dan pemantauan sistem.

Analisis mendalam tentang seni bina dan prinsip kerja rangka kerja Spring Pengenalan: Spring ialah salah satu rangka kerja sumber terbuka yang paling popular dalam ekosistem Java Ia bukan sahaja menyediakan set pengurusan kontena dan fungsi suntikan pergantungan yang berkuasa, tetapi juga menyediakan banyak fungsi lain, seperti urus niaga, AOP, akses data, dll. Artikel ini akan memberikan analisis mendalam tentang seni bina dan prinsip kerja rangka kerja Spring, dan menerangkan konsep berkaitan melalui contoh kod tertentu. 1. Konsep teras rangka kerja Spring 1.1IoC (Penyongsangan Kawalan) Teras Spring

Penjelasan terperinci tentang kaedah sambungan pangkalan data Oracle Dalam pembangunan aplikasi, sambungan pangkalan data adalah pautan yang sangat penting, yang membawa interaksi data antara aplikasi dan pangkalan data. Pangkalan data Oracle ialah sistem pengurusan pangkalan data hubungan dengan fungsi berkuasa dan prestasi yang stabil Dalam pembangunan sebenar, kita perlu mahir dalam kaedah sambungan yang berbeza untuk berinteraksi dengan pangkalan data Oracle. Artikel ini akan memperkenalkan secara terperinci beberapa kaedah sambungan biasa pangkalan data Oracle dan menyediakan contoh kod yang sepadan untuk membantu pembaca memahami dan menggunakan dengan lebih baik.

Mekanisme refleksi Java digunakan secara meluas dalam rangka kerja Spring untuk aspek berikut: Suntikan ketergantungan: instantiating kacang dan suntikan kebergantungan melalui refleksi. Penukaran jenis: Tukar parameter permintaan kepada jenis parameter kaedah. Penyepaduan rangka kerja kegigihan: memetakan kelas entiti dan jadual pangkalan data. Sokongan AspectJ: memintas panggilan kaedah dan meningkatkan tingkah laku kod. Proksi Dinamik: Cipta objek proksi untuk meningkatkan kelakuan objek asal.
