Kata pengantar
Alamat unduhan kode sampel untuk artikel ini (benar -benar jalankan, termasuk file SQL, harap modifikasi konfigurasi database setelah mengunduh): klik di sini untuk mengunduh
Beberapa operasi basis data dikendalikan secara keseluruhan, dan mereka berhasil atau gagal bersama.
Atomisitas: Mengacu pada transaksi menjadi unit pekerjaan yang tidak dapat dipisahkan, dan operasi dalam suatu transaksi terjadi atau tidak ada yang terjadi.
Konsistensi: berarti integritas data sebelum dan sesudah transaksi harus konsisten.
Isolasi: Ketika beberapa pengguna mengakses database secara bersamaan, transaksi satu pengguna tidak dapat diganggu oleh transaksi pengguna lain, dan data antara beberapa transaksi bersamaan harus diisolasi satu sama lain.
Kegigihan: Setelah transaksi dilakukan, perubahannya pada data dalam database bersifat permanen, dan kegagalan basis data instan seharusnya tidak berdampak padanya.
--Platform TransactionManager Transaction Manager (komit, transaksi rollback)
Spring menyediakan berbagai platform transactionManager implementasi untuk kerangka kerja kegigihan yang berbeda. menyukai:
Menggunakan DataSourCetransactionManager saat bertahan data menggunakan Spring JDBC atau IBATIS
Gunakan HibernatetransactionManager saat menggunakan Hibernate3.0 untuk data yang persisten
-Transaksi Transaksi Definisi Informasi Definisi (isolasi, propagasi, batas waktu, hanya baca)
Dirty Reading: Satu transaksi membaca data yang telah ditulis ulang oleh transaksi lain tetapi belum dikirimkan. Jika data ini digulung kembali, data yang dibaca tidak valid.
Tidak ada bacaan berulang: Dalam transaksi yang sama, hasilnya dikembalikan dengan membaca data yang sama beberapa kali berbeda.
Bacaan Fantasi: Setelah satu transaksi membaca beberapa baris catatan, transaksi lain menyisipkan beberapa catatan, dan pembacaan fantasi terjadi. Dalam kueri selanjutnya, transaksi pertama akan menemukan beberapa catatan yang awalnya tidak tersedia.
Level Isolasi Transaksi: (Lima Jenis)
Di antara mereka, MySQL menggunakan tingkat isolasi berulang secara default; Oracle menggunakan tingkat isolasi read_committed secara default
Perilaku Komunikasi Transaksi: (Tujuh Jenis)
-Transaksi Transaksi Transaksi Status Operasi Khusus
A. Manajemen Transaksi Pemrograman (Berdasarkan Kontrol Pemrograman Java, jarang digunakan)-Lihat Paket Demo1
Gunakan TransactionTemplate untuk merangkum beberapa operasi DAO
*B. Manajemen Transaksi Deklaratif (Kontrol Konfigurasi AOP Berbasis Musim Semi)
- Berdasarkan TransactionProxyFactoryBean. (Jarang digunakan)-lihat paket demo2
Penting untuk mengonfigurasi TransactionProxyFactoryBean untuk setiap kelas yang menjalani manajemen transaksi untuk peningkatan.
-Basar pada konfigurasi XML (sering digunakan) -Lihat paket Demo3
Setelah dikonfigurasi, tidak ada yang perlu ditambahkan ke kelas.
Jika tindakan adalah objek target untuk memasukkan transaksi, Anda perlu menambahkan atribut proxy-target-class = "true" ke elemen <aop: config>. Alasannya adalah untuk menginformasikan kerangka kerja Spring untuk menggunakan teknologi CGLIB untuk menghasilkan kelas tindakan dengan fungsi manajemen transaksi.
-Basar pada anotasi (konfigurasi sederhana, sering digunakan) -Lihat paket demo4
Aktifkan konfigurasi anotasi transaksi di ApplicationContext.xml. (Di ApplicationContext.xml, cukup tentukan kacang dan tambahkan elemen berikut)
<bean id = "txManager"> <name properti = "sessionfactory"> </propt> <tx: anotasi-digerakkan transaksi-manager = "txManager"/>
Gunakan @transactional di kelas komponen target, yang dapat ditentukan sebelum kelas atau sebelum metode.
--Programming
/ *** @Description: DAO Lapisan Antarmuka Kasus Transfer**/ Antarmuka Public AccountDao {/ *** @param out*: Akun transfer* @param Money*: Jumlah transfer*/ public void outmoney (string out, uang ganda); / ** * * @param di *: Akun transfer * @param uang *: Jumlah transfer */ public void inmoney (string in, double money); } / *** @description: Kelas implementasi lapisan DAO dari case transfer*/ kelas publik AccountDaoImpl memperluas JDBCDAOSupport mengimplementasikan AccountDao {/ *** @param out*: Transfer Account* @param Money*: Transfer Jumlah*/ @Override public void outmoney (string out, double money) {string); this.getjdbctemplate (). update (sql, money, out); } / *** @param di*: Akun transfer* @param Money*: Jumlah transfer* / @Override public void inmoney (string in, double money) {string sql = "Perbarui akun set uang = uang+? Di mana nama =?"; this.getjdbctemplate (). update (sql, money, in); }} / *** @description: Antarmuka bisnis dari case transfer**/ antarmuka publik AccountService {/ *** @param out: Transfer keluar* @param di: Transfer akun* @param Money: Jumlah transfer*/ transfer public void (string out, string in, double money); } / *** @Description: Kelas Implementasi Lapisan Bisnis dari Kasus Transfer*/ Kelas Publik AccountServiceImpl mengimplementasikan AccountService {// DAO Private Accountdao AccountDao; // template untuk suntikan transaksi manajemen transaksi swasta transaksi transaksi; / ** * @param out *: Transfer keluar * @param di *: Akun transfer * @param Money *: Jumlah transfer */ @Override public void transfer (string akhir, string akhir, uang ganda akhir) {// Jika terjadi pengecualian selama proses, operasi sebelumnya dapat diselesaikan. Jika yang terakhir tidak bisa, transfer berhasil tetapi transfer tidak diterima. // accountdao.outmoney (out, money); // int i = 1/0; // accountdao.inmoney (dalam, uang); transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult( TransactionStatus transactionStatus) { accountDao.outMoney(out, money); // int i = 1 / 0;//Transaction control, that is, an exception occurs, and the code in this segment is executed invalid Accountdao.inmoney (dalam, uang);}}); } public void setAccountDAo (AccountDao AccountDao) {this.accountDao = AccountDao; } public void setTransactionTemplate (transactionTemplate transactionTemplate) {this.transactionTemplate = transactionTemplate; }}ApplicationContext1.xml
<!-- Introduce external property files--> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- Configure c3p0 connection pool--> <bean id="dataSource"> <property name="driverClass" value="${jdbc.driverClass}" /> <property name="jdbcUrl" value = "$ {jdbc.url}" /> <name properti = "user" value = "$ {jdbc.userName}" /> <name properti = "kata sandi" value = "$ {jdbc.password}" /> </ bean "<!-mengkonfigurasi kelas bisnis lapisan-<bean id acountd =" "Accountserv =" "AccountServ =" "ACCOUNCERP =" ACACKOCE = "ACACKERA =" " /> <!-menyuntikkan templat untuk manajemen transaksi-> <name properti = "transactionTemplate" ref = "transactionTemplate" /> </ bean> <!-Konfigurasikan kelas DAO (disederhanakan, jdbctemplate akan dikonfigurasi secara otomatis)-> <bean id = "AccountDao"> <Properti name = " Kelas DAO (tidak disederhanakan)-> <!-<bean id = "jdbctemplate"> <name properti = "DataSource" ref = "DataSource" /> < /bean> <bean id = "AccountDao"> < / / /Jdbctemplate "Ref =" jdbctemple " /< /bean>--------JDBCTEMPLATE" /< / / / /JDBCTEMPLATE "REF =" JDBCTEMPLATE " /< /bean>-------------JDBCTEMPLATE"> < /bean>---JDBCTEMPLATE " ============================================================================================================================================================== ==================================================================================================================================================== ==================================================================================================================================================== ==================================================================================================================================================== Konfigurasikan Templat Manajemen Transaksi: Kelas yang disediakan oleh Spring untuk menyederhanakan kode manajemen transaksi -> <bean id = "transactionTemplate"> <name properti = "transactionManager" ref = "transactionManager"/> </bean>tes:
@Runwith (springjunit4classrunner.class) @contextConfiguration ("classPath: ApplicationContext1.xml") Public Class TransactionTest {@Resource (name = "AccountService") Private AccountServiceService; @Test public void demo1 () {AccountService.transfer ("AAA", "BBB", 200D); }}-Metode berdasarkan TransactionProxyFactoryBean
Public Class AccountServiceImpl mengimplementasikan AccountService {// DAO Private Accountdao AccountDao; / ** * @param out *: Transfer keluar * @param di *: Akun transfer * @param Money *: Jumlah transfer */ @Override public void transfer (string out, string in, double money) {accountdao.outmoney (out, uang); // int i = 1/0; Accountdao.inmoney (dalam, uang); } public void setAccountDAo (AccountDao AccountDao) {this.accountDao = AccountDao; }}ApplicationContext2.xml
<!-- Introduce external property files--> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- Configure c3p0 connection pool--> <bean id="dataSource"> <property name="driverClass" value="${jdbc.driverClass}" /> <property name="jdbcUrl" value = "$ {jdbc.url}" /> <name properti = "user" value = "$ {jdbc.userName}" /> <name properti = "kata sandi" value = "$ {jdbc.password}" /> </ bean "<!-mengkonfigurasi kelas bisnis lapisan-<bean id acountd =" "Accountserv =" "AccountServ =" "ACCOUNCERP =" ACACKOCE = "ACACKERA =" " /> < /bean> <!-Mengkonfigurasi kelas DAO (disederhanakan, secara otomatis mengkonfigurasi jdbctemplate)-> <bean id = "accountdao"> <name properti = "DataSource" ref = "DataSource" /> < /bean> <!- ===================================================================================================================================== ============================================================================================================================================================= ===================================================================================================================================== ============================================================================================================================================================= -> <!-Monfigurasi Transaction Manager-> <bean id = "TransactionManager"> <name properti = "DataSource" ref = "DataSource" /> </ bean> <!-Konfigurasikan proxy untuk lapisan bisnis-> <bean id = "AccountsEproxy"> <!-mengkonfigurasi objek target-> <acountserviceProxy "> <!-mengkonfigurasi objek target-> <acountserproxy"> <!-configure objek target objek-> <acountserviceProxy "> <! <property name="transactionManager" ref="transactionManager"></property> <!-- Inject transaction properties --> <property name="transactionAttributes"> <props> <!-- Format of prop: * PROPAGATION: Transaction propagation behavior* ISOTATION: Transaction isolation level* readOnly: Read-only* -EXCEPTION: Which exceptions roll back transactions* +EXCEPTION: Which exceptions do not roll back transaksi-> <prop key = "transfer"> propagation_required </prop> <!-<prop key = "transfer"> propagation_required, readonly </por>-> <!-<prop kunci = "transfer"> propagation_required, readonly </prop>-> <! KEY = "Transfer"> propagation_required,+java.lang.arithmeticException </prop> -> </props> </prop Property> </tean>tes:
@Runwith (springjunit4classrunner.class) @contextConfiguration ("classpath: applicationContext2.xml") public class transactionTest { / *** Pastikan untuk menyuntikkan kelas proxy (name = "nameic (name =) @RACECECE @" AccountService AccountService; @Test public void demo1 () {AccountService.transfer ("AAA", "BBB", 200D); }}-Berdasarkan konfigurasi XML
Public Class AccountServiceImpl mengimplementasikan AccountService {// DAO Private Accountdao AccountDao; / ** * @param out *: Transfer keluar * @param di *: Akun transfer * @param Money *: Jumlah transfer */ @Override public void transfer (string out, string in, double money) {accountdao.outmoney (out, uang); // int i = 1/0; Accountdao.inmoney (dalam, uang); } public void setAccountDAo (AccountDao AccountDao) {this.accountDao = AccountDao; }}ApplicationContext3.xml
<!-- Introduce external property files--> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- Configure c3p0 connection pool--> <bean id="dataSource"> <property name="driverClass" value="${jdbc.driverClass}" /> <property name="jdbcUrl" value = "$ {jdbc.url}" /> <name properti = "user" value = "$ {jdbc.userName}" /> <name properti = "kata sandi" value = "$ {jdbc.password}" /> </ bean "<!-mengkonfigurasi kelas bisnis lapisan-<bean id acountd =" "Accountserv =" "AccountServ =" "ACCOUNCERP =" ACACKOCE = "ACACKERA =" " /> < /bean> <!-Mengkonfigurasi kelas DAO (disederhanakan, secara otomatis mengkonfigurasi jdbctemplate)-> <bean id = "accountdao"> <name properti = "DataSource" ref = "DataSource" /> < /bean> <!- ================================================================== =================================================================== =================================================================== =================================================================== =================================================================== =================================================================== =================================================================== =================================================================== : Transaksi Propagasi Perilaku Isolasi: Tingkat Isolasi Transaksi Hanya Baca: Rollback-Rollback-For: Pengecualian mana yang terjadi no-rollback-for: Pengecualian mana yang terjadi bukan rollback timeout: Informasi kedaluwarsa-> <tx: Metode nama = "transfer" propagation = "wajib"/> </tx: Atribut> </tx: nasihat> <! <aop:pointcut expression="execution(* com.zs.spring.demo3.AccountService+.*(..))" id="pointcut1"/> <!-- Configuration section--> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/> </aop:config>tes:
/ *** @Description: Metode Manajemen Transaksi Deklaratif Musim Semi Dua: Konfigurasi XML Berbasis Aspek*/ @runwith (SpringJunit4ClassRunner.class) @contextConfiguration ("ClassPath: ApplicationContext3.xml") Public TransactionTest {/ ** harus menuntaskan Kelas Proksi: Karena Kelas Proxy: Karena Kelas Proxy: Kelas Proxy: Kelas Publicsy {/ ** harus menuntaskan Kelas Proksi: Karena Kelas Proxy: Karena Kelas Proxy: Karena Kelas Proxy: Kelas Proxy: Karena Kelas Proxy: Kelas Proxy: Karena Kelas Proxy: Karena Kelas Public "AccountService") Private AccountService AccountService; @Test public void demo1 () {AccountService.transfer ("AAA", "BBB", 200D); }}-didasarkan pada anotasi
/ *** @transactional Propagation: Transaction Propagation Behavior Isolation: Transaction Isolation Level Readly hanya: read-only* rollbackfor: mana yang terjadi norollbackfor: pengecualian mana yang terjadi bukan rollback* rollbackforclassname rollback sesuai dengan class name*/ @transactional (propagasi = propagasi, pengisolian cllasation. AccountServiceImpl mengimplementasikan AccountService {// DAO menyuntikkan Transfer Private AccountDao AccountDao; / *** @param out*: Akun transfer* @param di*: Akun transfer* @param uang*: Jumlah transfer*/ @Override public void transfer (string out, string in, double money) {accountdao.outmoney (out, uang); // int i = 1/0; Accountdao.inmoney (dalam, uang); } public void setAccountDAo (AccountDao AccountDao) {this.accountDao = AccountDao; }}ApplicationContext4.xml
<!-- Introduce external property files--> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- Configure c3p0 connection pool--> <bean id="dataSource"> <property name="driverClass" value="${jdbc.driverClass}" /> <property name="jdbcUrl" value = "$ {jdbc.url}" /> <name properti = "user" value = "$ {jdbc.userName}" /> <name properti = "kata sandi" value = "$ {jdbc.password}" /> </ bean "<!-mengkonfigurasi kelas bisnis lapisan-<bean id acountd =" "Accountserv =" "AccountServ =" "ACCOUNCERP =" ACACKOCE = "ACACKERA =" " /> < /bean> <!-Mengkonfigurasi kelas DAO (disederhanakan, secara otomatis mengkonfigurasi jdbctemplate)-> <bean id = "accountdao"> <name properti = "DataSource" ref = "DataSource" /> < /bean> <!- ===================================================================================================================================== ============================================================================================================================================================= ===================================================================================================================================== ============================================================================================================================================================= Konfigurasikan Transaction Manager-> <bean id = "TransactionManager"> <properti name = "DataSource" ref = "DataSource"/> </bean> <!-Nyalakan transaksi anotasi-> <tx: transaksi yang digerakkan oleh anotasi-manager = "transactionManager"/>tes:
@Runwith (springjunit4classrunner.class) @contextConfiguration ("classPath: applicationContext4.xml") class public TransactionTest { / *** Pastikan untuk menyuntikkan kelas proxy: karena kelas proxy melakukan operasi yang disempurnakan; @Test public void demo1 () {AccountService.transfer ("AAA", "BBB", 200D); }}Untuk kode referensi file dan data referensi database tertentu kode lengkap:
http://xiazai.vevb.com/201805/yuanma/spring-transaction_jb51.rar
Meringkaskan
Di atas adalah seluruh konten artikel ini. Saya berharap konten artikel ini memiliki nilai referensi tertentu untuk studi atau pekerjaan semua orang. Jika Anda memiliki pertanyaan, Anda dapat meninggalkan pesan untuk berkomunikasi. Terima kasih atas dukungan Anda ke wulin.com.