(12) Musim semi dari masuk ke urusan tanah-Musim semi
Transaksi musim semi
Transaksi adalah serangkaian operasi logis, baik semuanya dijalankan atau tidak dijalankan
Karakteristik transaksi (ACID)
- Atomicity
- konsistensi
- Isolasi
- Kegigihan
Ada beberapa cara untuk mengelola urusan di Spring
Apakah program mendukung transaksi tergantung pada apakah database mendukung transaksi
Bagaimana MySQL menjamin atomicity:
Mekanisme pemulihan diimplementasikan oleh log rollback
Transaksi terprogram, di-hardcode dalam kode (tidak disarankan)
Transaksi deklaratif, dikonfigurasi dalam file konfigurasi (disarankan), kode kurang mengganggu, direalisasikan melalui AOP
- berdasarkan
- Transaksi deklaratif berbasis anotasi
Pengantar Antarmuka Manajemen Transaksi Musim Semi
Tiga antarmuka terpenting yang terkait dengan manajemen transaksi di Spring adalah sebagai berikut
- PlatformTransactionManager: Manajer transaksi (Platform), inti dari strategi transaksi Musim Semi (manajer atas)
- TransactionDefinition: Informasi definisi transaksi (tingkat isolasi transaksi, perilaku penyebaran, batas waktu, hanya-baca, aturan rollback)
- TransactionStatus: Transaksi berjalan status
PlatformTransactionManager: Antarmuka Manajemen Transaksi
Spring tidak secara langsung mengelola transaksi, tetapi menyediakan berbagai pengelola transaksi. Spring menyediakan manajer transaksi yang sesuai untuk berbagai platform melalui antarmuka manajemen transaksi, dan implementasi spesifiknya adalah bisnis dari setiap platform.
Antarmuka ini terutama mengabstraksi perilaku manajemen transaksi, dan kemudian berbagai platform menerapkannya, yang dapat memastikan bahwa perilaku yang diberikan ke luar tetap tidak berubah dan memfasilitasi perluasan kami.
TransactionDefinition: Atribut transaksi
Kelas ini mendefinisikan beberapa atribut transaksi dasar.
Atribut transaksi mencakup lima aspek
- Tingkat isolasi
- Perilaku komunikasi
- Aturan rollback
- Hanya baca
- Batas waktu transaksi
TransactionStatus: Status transaksi
Antarmuka ini digunakan untuk mencatat status transaksi Antarmuka mendefinisikan sekumpulan metode untuk mendapatkan atau menentukan informasi status terkait dari transaksi tersebut.
public interface TransactionStatus{ boolean isNewTransaction(); // 是否是新的事务 boolean hasSavepoint(); // 是否有恢复点 void setRollbackOnly(); // 设置为只回滚 boolean isRollbackOnly(); // 是否为只回滚 boolean isCompleted; // 是否已完成}
Atribut transaksi mendetail
Perilaku propagasi transaksi musim semi (kelas enumerasi: Propagasi)
Perilaku propagasi transaksi adalah untuk memecahkan masalah transaksi panggilan satu sama lain antara lapisan bisnis.
Ketika metode transaksi dipanggil dengan metode transaksi lain, bagaimana transaksi harus disebarkan harus ditentukan. Misalnya: metode dapat terus berjalan dalam transaksi yang ada, atau dapat memulai transaksi baru dan menjalankan transaksinya sendiri.
Jenis perilaku penyebaran transaksi | Deskripsi | Apakah akan mendukung transaksi saat ini |
---|---|---|
YG DIBUTUHKAN | Jika saat ini ada transaksi, bergabunglah dengan transaksi; jika tidak ada transaksi saat ini, buat transaksi baru. (Default) | ✔ |
DUKUNGAN | Jika saat ini ada transaksi, bergabunglah dengan transaksi tersebut; jika tidak ada transaksi saat ini, terus jalankan dengan cara non-transaksional. | ✔ |
WAJIB | Jika saat ini ada transaksi, bergabunglah dengan transaksi tersebut; jika tidak ada transaksi saat ini, pengecualian dilempar. (Wajib: wajib) | ✔ |
REQUIRES_NEW | Buat transaksi baru, jika ada transaksi saat ini, kemudian tangguhkan transaksi saat ini. | ✘ |
TIDAK DIDUKUNG** | Jalankan dalam mode non-transaksional, jika ada transaksi saat ini, maka transaksi saat ini ditangguhkan. | ✘ |
TIDAK PERNAH | Jalankan dalam mode non-transaksional, jika ada transaksi saat ini, pengecualian dilempar. | ✘ |
BERLANGSUNG | Jika saat ini ada transaksi, buat transaksi untuk dijalankan sebagai transaksi bersarang dari transaksi saat ini; jika tidak ada transaksi saat ini, nilainya setara dengan REQUIRED. | ☹ |
Tingkat isolasi dalam transaksi Musim Semi (kelas pencacahan: Isolasi)
Lima konstanta yang merepresentasikan level isolasi ditentukan dalam antarmuka TransactionDefinition.
- ISOLATION_DEFAULT: Tingkat isolasi default database back-end, tingkat isolasi REPEATABLE_READ yang digunakan oleh Mysql secara default, tingkat isolasi READ_COMMITTED yang digunakan oleh Oracle secara default.
- ISOLATION_READ_UNCOMMITTED: Tingkat isolasi terendah, memungkinkan untuk membaca perubahan data yang tidak terikat, yang dapat menyebabkan pembacaan kotor, pembacaan bayangan, atau pembacaan yang tidak dapat diulang
- ISOLATION_READ_COMMITTED: Memungkinkan untuk membaca data yang telah dilakukan oleh transaksi bersamaan, yang dapat mencegah pembacaan kotor, tetapi pembacaan bayangan atau pembacaan yang tidak dapat diulang mungkin masih terjadi
- ISOLATION_REPEATABLE_READ: Hasil dari beberapa pembacaan dari bidang yang sama adalah konsisten, kecuali data diubah oleh transaksi itu sendiri, yang dapat mencegah pembacaan kotor dan pembacaan yang tidak dapat diulang, tetapi pembacaan bayangan mungkin masih terjadi.
- ISOLATION_SERIALIZABLE: Tingkat isolasi tertinggi, sepenuhnya sesuai dengan tingkat isolasi ACID. Semua transaksi dieksekusi satu per satu, sehingga tidak ada gangguan antar transaksi, yaitu level ini dapat mencegah pembacaan kotor, pembacaan tidak berulang, dan pembacaan bayangan . Tapi ini akan sangat mempengaruhi kinerja program. Biasanya, level ini juga tidak digunakan.
Properti batas waktu transaksi
Yang disebut batas waktu transaksi mengacu pada waktu maksimum yang diperbolehkan untuk mengeksekusi transaksi. Jika batas waktu terlampaui tetapi transaksi belum diselesaikan, transaksi secara otomatis dibatalkan. Nilai int digunakan untuk mewakili batas waktu di TransactionDefinition, satuannya adalah detik, dan nilai defaultnya adalah -1
Atribut hanya baca transaksi
Untuk transaksi yang hanya membaca kueri data, Anda dapat menentukan jenis transaksi sebagai hanya baca, yaitu atribut hanya baca. Transaksi hanya-baca tidak melibatkan modifikasi data, database akan menyediakan beberapa metode pengoptimalan, cocok untuk digunakan dalam beberapa operasi kueri database.
MySQL secara default mengaktifkan mode autocommit untuk setiap koneksi yang baru dibuat. Dalam mode ini, setiap pernyataan sql yang dikirim ke server MySQL akan diproses dalam transaksi terpisah. Setelah eksekusi, transaksi akan otomatis dilakukan dan yang baru akan dibuka. Urusan.
Jika Transaksi tidak ditambahkan, setiap SQL akan memulai transaksi terpisah, dan data akan diubah oleh transaksi lain di tengah, dan nilai terbaru akan dibaca secara real time.
Jika Anda menjalankan beberapa pernyataan kueri sekaligus, seperti kueri statistik, kueri laporan, dalam skenario ini, beberapa kueri SQL harus memastikan konsistensi baca secara keseluruhan, jika tidak, setelah kueri SQL sebelumnya, datanya akan menjadi Jika pengguna lain berubah, kueri statistik keseluruhan akan berada dalam keadaan data baca yang tidak konsisten. Pada saat ini, dukungan transaksi harus diaktifkan
Aturan rollback transaksi
Aturan ini menentukan pengecualian mana yang akan menyebabkan transaksi dibatalkan dan yang tidak. Secara default, transaksi hanya akan dibatalkan ketika menemui pengecualian waktu proses (subkelas dari RuntimeException). Kesalahan juga akan menyebabkan transaksi dibatalkan, tetapi tidak akan dibatalkan ketika menemukan pengecualian yang Dicentang.
Jika Anda ingin menentukan jenis pengecualian yang Anda kembalikan, Anda dapat melakukan ini
@Transactional(rollbackFor = MyException.class)
@Transaction annotation
Lingkup tindakan
- Metode: Direkomendasikan untuk menggunakan anotasi pada metode, tetapi perlu dicatat bahwa anotasi ini hanya dapat diterapkan pada metode publik, jika tidak maka tidak akan berpengaruh
- Kelas: Jika didefinisikan di kelas, itu berarti bahwa semua metode publik di kelas itu valid
- Antarmuka: Tidak disarankan untuk digunakan pada antarmuka
Parameter konfigurasi umum
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Transactional { @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager() default ""; Propagation propagation() default Propagation.REQUIRED; Isolation isolation() default Isolation.DEFAULT; int timeout() default TransactionDefinition.TIMEOUT_DEFAULT; boolean readOnly() default false; Class<? extends Throwable>[] rollbackFor() default {}; String[] rollbackForClassName() default {}; Class<? extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {};}
Ringkasan parameter konfigurasi umum @Transactional
Nama atribut | Deskripsi |
---|---|
perambatan | Mode penyebaran transaksi, default DIBUTUHKAN |
isolasi | Tingkat isolasi transaksi, default DEFAULT |
waktu habis | Waktu transaksi habis, defaultnya adalah -1 (tanpa batas waktu). Jika batas waktu tidak selesai, maka secara otomatis akan dibatalkan |
readOnly | Tentukan apakah transaksi tersebut hanya baca, defaultnya salah |
rollbackFor | Digunakan untuk menentukan jenis pengecualian yang dapat memicu rollback transaksi, dan beberapa jenis pengecualian dapat ditentukan |
@ Prinsip anotasi transaksi transaksi
Mekanisme kerja @Transaction dilaksanakan berdasarkan AOP yang diimplementasikan menggunakan dynamic proxy. Jika objek target mengimplementasikan antarmuka, proxy dinamis JDK digunakan secara default. Jika objek tidak mengimplementasikan antarmuka, Cglib akan digunakan sebagai proxy dinamis
Metode createAopProxy () menentukan apakah akan menggunakan JDK atau Cglib untuk proxy dinamis
Jika sebuah kelas atau metode publik dalam sebuah kelas dianotasi dengan anotasi @Transaction, penampung Spring akan membuat kelas proxy untuk itu ketika dimulai, dan ketika metode publik yang dianotasi oleh @Transaction dipanggil, kelas TransactionInterceptor sebenarnya disebut Invoke metode dalam. Fungsi metode ini adalah untuk memulai transaksi sebelum metode target. Jika pengecualian ditemukan selama eksekusi metode, transaksi dibatalkan, dan transaksi dilakukan setelah pemanggilan metode selesai.
Kegagalan anotasi
Diterapkan ke metode modifikasi non-publik
Spring AOP masalah self-invoking
Jika metode lain dalam kelas yang sama yang tidak dianotasi dengan @Transaction secara internal memanggil metode yang dianotasi dengan @Transaction, transaksi metode yang dianotasi dengan @Transaction akan menjadi tidak valid.
Hal ini disebabkan oleh proxy Spring AOP, karena manajemen transaksi Spring berlaku hanya jika metode beranotasi @Transaction dipanggil di luar kelas.
Solusinya adalah menghindari panggilan mandiri di kelas yang sama atau menggunakan AspectJ untuk menggantikan proxy Spring AOP.
Atribut propagasi disetel dengan tidak benar
rollbackFor kesalahan pengaturan atribut
Tidak terkecuali dilemparkan ke dalam coba / tangkap dan gagal
Database tidak mendukung transaksi
Akhirnya
- Jika Anda merasa dihargai setelah membacanya, saya harap dapat memberi saya jempol. Ini akan menjadi motivasi terbesar saya untuk memperbarui. Terima kasih atas dukungan Anda.
- Selamat datang semuanya untuk memperhatikan akun resmi saya [Java Fox], fokus pada pengetahuan dasar tentang java dan komputer, dan pastikan bahwa Anda akan mendapatkan sesuatu setelah membacanya. Jika Anda tidak percaya, hubungi saya
- Jika Anda memiliki pendapat atau saran berbeda setelah membaca, silakan berkomentar dan berbagi. Terima kasih atas dukungan dan cinta Anda.
——Aku Tsukahu, aku suka pemrograman sama seperti kamu.
Selamat datang untuk mengikuti akun publik "Java Fox" untuk berita terbaru
Komentar
Posting Komentar