(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 transaksiDeskripsiApakah akan mendukung transaksi saat ini
YG DIBUTUHKANJika saat ini ada transaksi, bergabunglah dengan transaksi; jika tidak ada transaksi saat ini, buat transaksi baru. (Default)
DUKUNGANJika saat ini ada transaksi, bergabunglah dengan transaksi tersebut; jika tidak ada transaksi saat ini, terus jalankan dengan cara non-transaksional.
WAJIBJika saat ini ada transaksi, bergabunglah dengan transaksi tersebut; jika tidak ada transaksi saat ini, pengecualian dilempar. (Wajib: wajib)
REQUIRES_NEWBuat 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 PERNAHJalankan dalam mode non-transaksional, jika ada transaksi saat ini, pengecualian dilempar.
BERLANGSUNGJika 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 atributDeskripsi
perambatanMode penyebaran transaksi, default DIBUTUHKAN
isolasiTingkat isolasi transaksi, default DEFAULT
waktu habisWaktu transaksi habis, defaultnya adalah -1 (tanpa batas waktu). Jika batas waktu tidak selesai, maka secara otomatis akan dibatalkan
readOnlyTentukan apakah transaksi tersebut hanya baca, defaultnya salah
rollbackForDigunakan 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

Postingan populer dari blog ini

Menerobos hambatan, "pengembangan iOS", pertanyaan yang diperlukan untuk wawancara kerja lompat (untuk pewawancara setelah setahun)

“Saya tidak dapat membantu Anda setelah memasuki lab kateterisasi!” Hu Dayi mengenang: kisah sedih tentang stent

Mantan Anggota Kongres Pentagon AS membocorkan video UFO