Ringkasan
Manajemen transaksi sangat penting untuk aplikasi perusahaan, dan dapat memastikan konsistensi data bahkan jika situasi abnormal terjadi.
Kerangka kerja Spring memberikan abstraksi yang konsisten untuk manajemen transaksi, dengan karakteristiknya sebagai berikut:
Berikan model pemrograman yang konsisten untuk API transaksi yang berbeda, seperti JTA (Java Transaction API), JDBC, Hibernate, JPA (Java Persistence API dan JDO (Objek Data Java)
Mendukung manajemen transaksi deklaratif, terutama manajemen transaksi deklaratif berdasarkan anotasi, yang sederhana dan mudah digunakan
Memberikan API manajemen transaksi pemrograman yang lebih sederhana daripada API transaksi lainnya seperti JTA
Integrasi sempurna dengan abstraksi akses data pegas
Metode manajemen transaksi
Spring mendukung dua metode: manajemen transaksi terprogram dan manajemen transaksi deklaratif.
Manajemen transaksi terprogram menggunakan TransactionTemplate atau secara langsung menggunakan PlatformTransactionManager yang mendasarinya. Untuk manajemen transaksi terprogram, Spring merekomendasikan penggunaan TransactionTemplate.
Manajemen transaksi deklaratif dibangun di atas AOP. Intinya adalah mencegat metode sebelum dan sesudah, dan kemudian membuat atau menambahkan transaksi sebelum metode target dimulai. Setelah menjalankan metode target, transaksi diserahkan atau digulung kembali sesuai dengan situasi eksekusi. Keuntungan terbesar dari transaksi deklaratif adalah bahwa mereka tidak perlu mengelola transaksi secara terprogram, sehingga tidak perlu kode manajemen transaksi dopant dalam kode logika bisnis. Cukup buat deklarasi aturan transaksi yang relevan dalam file konfigurasi (atau melalui anotasi @transactional) dan Anda dapat menerapkan aturan transaksi ke logika bisnis.
Jelas, manajemen transaksi deklaratif lebih baik daripada manajemen transaksi terprogram, yang merupakan metode pengembangan non-invasif yang dianjurkan oleh Spring. Manajemen transaksi deklaratif menjaga kode bisnis bebas dari kontaminasi. Objek POJO normal dapat memperoleh dukungan transaksi lengkap dengan menambahkan anotasi. Dibandingkan dengan transaksi pemrograman, satu -satunya kelemahan dari transaksi deklaratif adalah bahwa granularitas terbaik yang terakhir hanya dapat bertindak pada tingkat metode, dan tidak dapat dicapai sebagai transaksi pemrograman dapat bertindak pada tingkat blok kode. Namun, bahkan dengan persyaratan seperti itu, ada banyak solusi, seperti blok kode yang membutuhkan manajemen transaksi dapat diproses secara independen, dll.
Ada juga dua metode yang umum digunakan untuk manajemen transaksi deklaratif. Salah satunya adalah file konfigurasi XML berdasarkan namespaces TX dan AOP, dan yang lainnya didasarkan pada anotasi @transactional. Jelas, metode berbasis anotasi lebih sederhana dan lebih mudah digunakan dan lebih menyegarkan.
Komitmen Otomatis (AutoCommit) dan apakah akan secara otomatis mengirimkan saat koneksi ditutup
Pengajuan Otomatis
Secara default, database dalam mode pengiriman otomatis. Setiap pernyataan dalam transaksi terpisah. Ketika eksekusi pernyataan ini selesai, jika eksekusi berhasil, transaksi secara implisit diserahkan.
Jika eksekusi gagal, transaksi secara implisit digulung kembali.
Untuk manajemen transaksi normal, satu set operasi terkait dalam suatu transaksi, sehingga mode komit otomatis basis data harus dimatikan. Namun, kami tidak perlu khawatir tentang ini, Spring akan mengatur fitur komit otomatis dari koneksi yang mendasari ke False.
org/springframework/jdbc/datasource/datasourcetransactionManager.java
// beralih ke komit manual jika perlu. Ini sangat mahal di beberapa driver JDBC, // jadi kami tidak ingin melakukannya secara tidak perlu (misalnya jika kami telah secara eksplisit // mengonfigurasi kumpulan koneksi untuk mengaturnya) .Jika (congetAutocommit ()) {txObject.setMustrestoreAutOcommit (true); if (logger.isdebugeNabled ()) {logger.debug ("switching jdbc connection [" + con + "] ke manual commit"); } con.setAutocommit (false);}Beberapa kumpulan koneksi data menyediakan pengaturan untuk mematikan komit transaksi otomatis, yang terbaik untuk dimatikan saat menyiapkan kumpulan koneksi. Namun, C3P0 tidak menyediakan fitur ini dan hanya dapat mengandalkan musim semi untuk mengaturnya.
Karena spesifikasi JDBC menetapkan bahwa ketika objek koneksi ditetapkan, itu harus dalam mode komit otomatis, yang merupakan nilai default di seluruh DBM, dan komit otomatis harus dimatikan secara eksplisit jika perlu. C3P0 mematuhi spesifikasi ini dan memungkinkan kode klien untuk secara eksplisit mengatur mode pengiriman yang diperlukan.
Apakah akan mengirimkan secara otomatis saat koneksi ditutup
Ketika koneksi ditutup, apa yang harus ditangani jika ada transaksi yang tidak berkomitmen? Spesifikasi JDBC tidak menyebutkan bahwa kebijakan default C3P0 adalah untuk mengembalikan transaksi yang tidak berkomitmen. Ini adalah strategi yang tepat, tetapi tidak ada kesepakatan di antara penyedia pengemudi JDBC tentang masalah ini.
Properti AutoCommitclose dari C3P0 adalah false secara default, jadi tidak perlu tidak memindahkannya. Atau Anda dapat secara eksplisit mengatur properti ini menjadi false, yang akan lebih jelas.
Konfigurasi Manajemen Transaksi Deklaratif Berbasis Anotasi
Spring-servlet.xml
<!-Dukungan Transaksi-> <!-PlatformTransActionMnager-> <bean id = "txManager"> <name properti = "DataSource" ref = "DataSource" /> < /bean> <!-Mengaktifkan dukungan anotasi transaksi-> <tx: transaksi transaksi yang digerakkan oleh anotasi = "txManager" />
Juga tambahkan TX namespace di Spring-Servlet.xml
... xmlns: tx = "http://www.springframework.org/schema/tx" xmlns: aop = "http://www.springframework.org/schema/aop" xsi: schemalocation = "... http. http://www.springframework.org/schema/tx/spring-tx.xsd ...
MyBatis secara otomatis berpartisipasi dalam manajemen transaksi pegas tanpa konfigurasi tambahan. Selama sumber data yang dirujuk oleh org.mybatis.spring.sqlSessionFactoryBean konsisten dengan sumber data yang dirujuk oleh DataSourCetransactionManager, jika tidak manajemen transaksi tidak akan berfungsi.
Selain itu, Anda perlu mengunduh paket ketergantungan aopalliance.jar dan memasukkannya ke dalam direktori Web-INF/LIB. Kalau tidak, pengecualian akan dilaporkan saat musim semi diinisialisasi
java.lang.noclassdeffounderror: org/aopalliance/intercept/methodInterceptor
Fitur Transaksi Musim Semi
Semua kelas kebijakan manajemen transaksi di musim semi diwarisi dari org.springframework.transaction.platformTransactionManager Antarmuka
Public Interface PlatformTransactionManager {TransactionStatus getTransaction (Definisi Lefinisi Transaction) melempar TransactionException; void commit (status transactionstatus) melempar TransactionException; membatalkan rollback (status transactionstatus) melempar transactionException;}Antarmuka TransactionDefinition mendefinisikan karakteristik berikut:
Tingkat isolasi transaksi
Tingkat isolasi mengacu pada tingkat isolasi antara beberapa transaksi bersamaan. Lima konstanta yang mewakili tingkat isolasi didefinisikan dalam antarmuka definisi transaksi:
TransactionDefinition.isolation_default: Ini adalah nilai default, menunjukkan tingkat isolasi default yang digunakan untuk database yang mendasarinya. Untuk sebagian besar database, nilai ini biasanya transactionDefinition.isolation_read_committed.
TransactionDefinition.isolation_read_uncommitted: Tingkat isolasi ini menunjukkan bahwa satu transaksi dapat membaca data yang dimodifikasi oleh transaksi lain tetapi belum dilakukan. Level ini tidak mencegah pembacaan kotor, bacaan berulang, dan pembacaan hantu, jadi tingkat isolasi ini jarang digunakan. Misalnya, PostgreSQL sebenarnya tidak memiliki level ini.
TransactionDefinition.isolation_read_Committed: Tingkat isolasi ini berarti bahwa satu transaksi hanya dapat membaca data yang telah dilakukan oleh transaksi lain. Level ini mencegah pembacaan kotor, yang juga merupakan nilai yang disarankan dalam banyak kasus.
TransactionDefinition.isolation_repeatable_read: Tingkat isolasi ini menunjukkan bahwa transaksi dapat menjalankan kueri beberapa kali selama proses, dan catatan yang dikembalikan adalah sama setiap kali. Level ini mencegah bacaan yang kotor dan tidak dapat diulang.
TransactionDefinition.isolation_serializable: Semua transaksi dieksekusi satu per satu secara berurutan, sehingga tidak ada kemungkinan gangguan antara transaksi, yaitu, level ini dapat mencegah pembacaan kotor, bacaan yang tidak dapat diulang dan pembacaan hantu. Tapi ini akan sangat mempengaruhi kinerja program. Level ini biasanya tidak digunakan.
Perilaku komunikasi transaksi
Yang disebut perilaku perambatan transaksi mengacu pada bahwa jika konteks transaksi sudah ada sebelum transaksi saat ini dimulai, ada beberapa opsi yang dapat menentukan perilaku eksekusi metode transaksional. Definisi definisi transaksi mencakup konstanta berikut yang mewakili perilaku propagasi:
TransactionDefinition.propagation_required: Jika transaksi saat ini hadir, bergabunglah dengan transaksi; Jika saat ini tidak ada transaksi, buat transaksi baru. Ini adalah nilai default.
TransactionDefinition.propagation_requires_new: Membuat transaksi baru, dan jika transaksi saat ini ada, transaksi saat ini akan ditangguhkan.
TransactionDefinition.propagation_supports: Bergabunglah dengan transaksi jika saat ini ada transaksi; Jika saat ini tidak ada transaksi, ia terus berjalan dengan cara yang tidak transaksional.
TransactionDefinition.propagation_not_supported: berjalan dengan cara non-transaksional, dan jika transaksi saat ini ada, transaksi saat ini akan ditangguhkan.
TransactionDefinition.propagation_never: berjalan dengan cara yang tidak transaksional, melempar pengecualian jika transaksi saat ini ada.
TransactionDefinition.propagation_mandatory: Bergabunglah dengan transaksi jika saat ini ada transaksi; Jika saat ini tidak ada transaksi, pengecualian dilemparkan.
TransactionDefinition.propagation_nested: Jika transaksi saat ini hadir, transaksi dibuat untuk dijalankan sebagai transaksi bersarang dari transaksi saat ini; Jika tidak ada transaksi, nilainya setara dengan TransactionDefinition.propagation_required.
Timeout transaksi
Batas waktu yang disebut transaksi mengacu pada waktu maksimum yang diizinkan oleh transaksi. Jika batas waktu terlampaui tetapi transaksi belum selesai, transaksi akan secara otomatis digulung kembali. Dalam TransactionDefinition, batas waktu diwakili oleh nilai int, dan unitnya adalah detik.
Pengaturan default adalah nilai batas waktu dari sistem transaksi yang mendasarinya. Jika sistem transaksi database yang mendasarinya tidak menetapkan nilai batas waktu, maka itu tidak ada, dan tidak ada batas waktu batas waktu.
Atribut Baca-Hanya Transaksi
Transaksi baca saja digunakan dalam situasi di mana kode klien hanya baca tetapi tidak memodifikasi data. Transaksi baca saja digunakan dalam optimasi dalam skenario tertentu, seperti saat menggunakan hibernate.
Defaultnya adalah transaksi baca dan tulis.
Aturan rollback transaksi musim semi
Cara yang disarankan untuk menginstruksikan manajer transaksi musim semi untuk mengembalikan transaksi adalah dengan melemparkan pengecualian dalam konteks transaksi saat ini. Manajer Transaksi Musim Semi menangkap pengecualian yang tidak ditangani dan kemudian memutuskan apakah akan mengembalikan transaksi yang melempar pengecualian berdasarkan aturan.
Secara default, Spring hanya akan memutar kembali transaksi jika pengecualian yang dilemparkan adalah pengecualian runtime yang tidak dicentang, yaitu, pengecualian yang dilemparkan adalah subkelas dari runimeException (kesalahan juga akan menyebabkan rollback transaksi), sementara melempar pengecualian yang diperiksa tidak akan menyebabkan transaksi rollback.
Dimungkinkan untuk secara eksplisit mengonfigurasi transaksi untuk memutar balik ketika pengecualian tersebut dilemparkan, termasuk pengecualian yang diperiksa. Dimungkinkan juga untuk secara jelas mendefinisikan transaksi yang tidak mundur ketika pengecualian dilemparkan.
Anda juga dapat secara terprogram menggunakan metode SetrollBackOnly () untuk menunjukkan bahwa transaksi harus digulung kembali. Satu -satunya hal yang dapat Anda lakukan setelah menelepon SetrollbackOnly () adalah Rollback.
@Transactional Anotasi
@Transactional Properties
| milik | jenis | menggambarkan |
|---|---|---|
| nilai | Rangkaian | Deskriptor kualifikasi opsional, menentukan transaksi manajer untuk digunakan |
| perambatan | enum: propagasi | Pengaturan Perilaku Propagasi Transaksi Opsional |
| isolasi | enum: isolasi | Pengaturan tingkat isolasi transaksi opsional |
| readonly | Boolean | Baca dan Tulis atau Transaksi Baca saja, Default Read and Write |
| Batas waktu | int (dalam detik granularity) | Pengaturan batas waktu transaksi |
| rollbackfor | Array objek kelas harus diwarisi dari yang dapat dilemparkan | Array kelas pengecualian yang menyebabkan rollback transaksi |
| rollbackforclassname | Array nama kelas harus diwarisi dari yang bisa dilemparkan | Array nama kelas pengecualian yang menyebabkan transaksi rollback |
| Norollbackfor | Array objek kelas harus diwarisi dari yang dapat dilemparkan | Array kelas pengecualian yang tidak menyebabkan rollback transaksi |
| NorollbackForClassName | Array nama kelas harus diwarisi dari yang bisa dilemparkan | Serangkaian nama kelas pengecualian yang tidak akan menyebabkan rollback transaksi |
penggunaan
@Transactional dapat bertindak berdasarkan antarmuka, metode antarmuka, kelas, dan metode kelas. Saat bertindak di kelas, semua metode publik kelas akan memiliki sifat transaksi jenis itu. Pada saat yang sama, kita juga dapat menggunakan anotasi ini pada tingkat metode untuk mengesampingkan definisi tingkat kelas.
Meskipun anotasi @transactional dapat diterapkan pada antarmuka, metode antarmuka, kelas, dan metode kelas, Spring menyarankan untuk tidak menggunakan anotasi ini pada antarmuka atau metode antarmuka, karena ini hanya akan berlaku saat menggunakan proxy berbasis antarmuka. Selain itu, anotasi @transactional hanya boleh diterapkan pada metode publik, yang ditentukan oleh sifat AOP pegas. Jika Anda menggunakan anotasi @transactional pada metode visibilitas yang dilindungi, pribadi, atau default, ini akan diabaikan dan tidak ada pengecualian yang akan dilemparkan.
Secara default, hanya metode panggilan dari luar yang akan ditangkap oleh proxy AOP, yaitu memanggil metode lain di dalam kelas ini di dalam kelas tidak akan menyebabkan perilaku transaksi, bahkan jika metode yang dipanggil dimodifikasi menggunakan anotasi @transactional.
@Transactional (readonly = true) kelas publik defaultFooservice mengimplementasikan fooservice {public foo getFoo (string fooname) {// lakukan sesuatu} // Pengaturan ini memiliki prioritas untuk metode ini // Atribut anotasi = propagasi public = propagasi. updateFoo (foo foo) {// lakukan sesuatu}}Meringkaskan
Di atas adalah semua konten interpretasi artikel ini tentang penggunaan anotasi @transactional di musim semi, dan 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!