Dalam Manajemen Transaksi Spring Boot, implementasikan PlatformTransactionManager antarmuka sendiri.
PRATTRACTRANSACTIGER PLATPRANSAGER PUBLIK {org.springframework.transaction.transactionstatus getTransaction (org.springframework.transaction.transactionDefinition TransactionDefinition) melempar org.springframework.transaction.transaction exception; void commit (org.springframework.transaction.transactionstatus transactionstatus) melempar org.springframework.transaction.transactionException; void rollback (org.springframework.transaction.transactionstatus transactionstatus) melempar org.springframework.transaction.transactionException;}Ketika kami menggunakan ketergantungan Spring-Boot-Starter-JDBC, kerangka kerja akan secara otomatis menyuntikkan DataSourCetransactionManager secara default. Jadi kami tidak memerlukan konfigurasi tambahan untuk menggunakan anotasi @transactional untuk penggunaan transaksi.
Manajer Transaksi JDBC
Dalam layanan, metode yang dianotasi oleh @transactional akan mendukung transaksi. Jika anotasi berada di kelas, semua metode dari seluruh transaksi dukungan kelas secara default.
Situasi Manajer Multi-Transaksi
1: Anda dapat mengimplementasikan antarmuka TransactionManagement Configurer, dan nilai pengembalian metode di dalamnya adalah Manajer Transaksi Default.
2: Anda dapat mengatur nilai pada metode eksekusi tertentu
Jika ada beberapa instance PlatformTransactionManager di Spring Container dan antarmuka transactionManagement Configurer tidak diimplementasikan untuk menentukan nilai default, ketika kita menggunakan anotasi @transactional pada metode ini, kita harus menentukannya dengan nilai. Jika tidak ditentukan, pengecualian akan dilemparkan.
//@EnableTransactionManagement // Turn on annotation transaction management, which is equivalent to <tx:annotation-driven />@SpringBootApplicationpublic class ProfiledemoApplication implements TransactionManagementConfigurer { @Resource(name="txManager2") private PlatformTransactionManager txManager2; // Buat Manajer Transaksi secara manual 1 Kerangka kerja DataSource akan secara otomatis disuntikkan // dalam wadah musim semi, kami secara manual anotasi @bean akan dimuat terlebih dahulu, dan kerangka kerja tidak akan menginstrasi kembali kelas implementasi PlatformTransactionagager lainnya. @Bean (name = "txManager1") Public PlatformTransActionManager TXManager (DataSource DataSource) {return New DataSourCetRansActionManager (DataSource); } // Buat TransactionManager 2 @Bean (name = "TXManager2") PLATPERTRANSACTICER PUBLIK TXManager2 (EntityManagerFactory Factory) {return jpatransactionManager baru (factory); } // Menerapkan Metode Antarmuka TransactionManagement Configurer yang nilai pengembaliannya mewakili manajer transaksi yang digunakan secara default jika Anda memiliki beberapa manajer transaksi @Override Public PlatformTransactionManager AnnotationDriventRansActionManager () {return txManager2; } public static void main (string [] args) {springApplication.run (ProfileMoApplication.class, args); }}Implementasi spesifik
@ComponentPublic kelas DevSendMessage mengimplementasikan SendMessage {// Gunakan nilai untuk menentukan manajer transaksi mana yang menggunakan @transactional (value = "txManager1") @Override public void kirim () {System.out.println (">>>>>>>>>>>>>> Dev {System.out.println (" >>>>>>>>>>>>>> Dev () <) <) <) <) <) <) (<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< () send2 (); } @Transactional public void send2 () {System.out.println (">>>>>>>>>>>> dev kirim2 () <<<<<<<<"); }}Tingkat isolasi
public enum Isolation { DEFAULT(TransactionDefinition.ISOLATION_DEFAULT), READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED), READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED), REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ), Serializable (transactionDefinition.isolation_serializable); nilai int akhir pribadi; Isolasi (nilai int) {this.value = nilai; } public int value () {return this.value; }} Tentukan metode: diatur dengan menggunakan properti isolasi, misalnya:
@Transactional (isolation = isolation.default)
Perilaku komunikasi
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.
Kita dapat melihat bahwa kelas enumerasi org.springframework.transaction.annotation.propagation mendefinisikan 6 nilai enum yang mewakili perilaku propagasi:
propagasi enum publik {wajib (transactionDefinition.propagation_required), mendukung (transactionDefinition.propagation_supports), wajib (transactionDefinition.propagation_mandatory), wajib_new (transactionDefinition.propagation_requires_new) Not_supported (transactionDefinition.propagation_not_supported), never (transactionDefinition.propagation_never), bersarang (transactionDefinition.propagation_nested); nilai int akhir pribadi; Propagasi (nilai int) {this.value = nilai; } public int value () {return this.value; }}Diperlukan: Jika transaksi saat ini hadir, bergabunglah dengan transaksi; Jika saat ini tidak ada transaksi, buat transaksi baru. nilai default.
Dukungan: Jika suatu transaksi saat ini hadir, bergabunglah dengan transaksi; Jika saat ini tidak ada transaksi, terus berjalan dengan cara yang tidak transaksional.
Wajib: Jika transaksi saat ini hadir, bergabunglah dengan transaksi; Jika saat ini tidak ada transaksi, pengecualian dilemparkan. (Terpaksa memasukkannya ke dalam transaksi)
Membutuhkan_new: Membuat transaksi baru, dan jika transaksi saat ini ada, transaksi saat ini akan ditangguhkan. (Log pencetakan sering digunakan. Bahkan jika rollback sebelumnya digulung kembali, transaksi akan dijalankan dan pesan kesalahan akan dicatat)
Not_supted: berjalan dengan cara non-transaksional. Jika transaksi saat ini ada, transaksi saat ini akan ditangguhkan.
Never: berjalan dengan cara yang tidak transaksional, melempar pengecualian jika transaksi saat ini ada.
Nested: Jika transaksi saat ini ada, transaksi dibuat untuk dijalankan sebagai transaksi bersarang dari transaksi saat ini; Jika tidak ada transaksi saat ini, nilainya setara dengan yang diperlukan.
Tentukan metode: diatur dengan menggunakan properti propagasi, misalnya:
@Transactional (propagasi = propagasi. yang diperlukan)
Transaksi bukan situasi rollback
Roll Back Hanya jika runimeException yang tidak dibawa terjadi
Pengecualian yang dilemparkan oleh tangkapan akan berhasil saat kedua sisipan
@Override @transactional public void insertandInsert (staf staf) {staffdao.insert (staf); coba {int i = 1 /0; } catch (Exception e) {E.PrintStackTrace (); } staffdao.insert (staf); }Ditambahkan ke pernyataan tangkapan dari metode lapisan layanan: transactionAspectSupport.currentTransactionStatus (). SetrollbackOnly (); pernyataan, rollback manual tidak akan memasukkan data
@Override @transactional void InsertAndIndInsert (staf staf) melempar Exception {coba {staffdao.insert (staf); int i = 1/0; Staffdao.insert (staf); } catch (exception e) {transactionAspectSupport.currentTransactionStatus (). setrollBackOnly (); }}Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.