Artikel ini terutama mempelajari konten yang relevan dari mekanisme transaksi Spring, sebagai berikut.
Biasanya ada dua strategi transaksi: transaksi global dan transaksi lokal. Transaksi global dapat menjangkau beberapa sumber daya transaksional (mis., Sumber data, biasanya database dan antrian pesan), dan biasanya memerlukan manajemen server aplikasi J2EE, yang memerlukan dukungan JTA server di bagian bawah. Transaksi lokal terkait dengan teknologi kegigihan yang diadopsi oleh lapisan yang mendasarinya. Jika lapisan yang mendasarinya secara langsung menggunakan JDBC, objek koneksi perlu digunakan untuk mengoperasikan transaksi. Jika teknologi kegigihan hibernate digunakan, Anda perlu menggunakan objek sesi untuk mengoperasikan transaksi.
Secara umum, proses pemrograman menggunakan transaksi JTA, transaksi JDBC dan transaksi hibernasi kira -kira sebagai berikut.
Seperti dapat dilihat dari gambar di atas, menggunakan pemrograman transaksi tradisional, kode program harus digabungkan dengan API kebijakan transaksi spesifik. Jika aplikasi perlu mengganti strategi, itu berarti bahwa kode perlu sangat dimodifikasi. Tetapi jika Anda menggunakan transaksi pegas, tidak akan ada masalah.
SRING tidak memberikan dukungan transaksi apa pun, itu hanya bertanggung jawab untuk membungkus transaksi yang mendasarinya, dan pada level musim semi, ia menyediakan API pemrograman terpadu ke dunia luar. Inti dari transaksi pegas adalah antarmuka PlatformTransActionManager.
PlatformTransactionManager mewakili antarmuka transaksi yang tidak tergantung pada jenis spesifik dan dapat mewakili transaksi apa pun, termasuk transaksi JDBC, transaksi hibernasi, dan bahkan transaksi JTA.
Mekanisme transaksi Spring adalah model kebijakan yang khas. PlatformTransactionManager mewakili antarmuka manajemen transaksi, tetapi tidak tahu bagaimana mengelola transaksi. Ini hanya membutuhkan manajemen transaksi untuk memberikan tiga metode: mulai transaksi getTransaction(), transaksi commit() dan rollback() Namun, implementasi spesifik diserahkan kepada kelas implementasinya untuk diselesaikan. Pemrogram hanya perlu mengkonfigurasi jenis transaksi dalam file konfigurasi sesuai dengan jenis transaksi spesifik yang digunakan. Musim semi yang mendasarinya akan secara otomatis menggunakan kelas implementasi transaksi spesifik untuk melakukan operasi transaksi. Untuk pemrogram, mereka tidak perlu peduli dengan proses yang mendasarinya, mereka hanya perlu memprogram untuk antarmuka PlatformTransactionManager. Antarmuka PlatformTransactionManager menyediakan metode berikut: getTransaction(..), commit(); rollback(); Ini semua adalah operasi transaksi yang tidak terkait dengan platform.
Penulisan lengkap getTransaction() adalah TransactionStatus getTransaction(TransactionDefinition definiton)
Metode ini digunakan untuk mengembalikan objek transaksi, dan Parameter TransactionDefinition dapat menentukan berbagai atribut untuk objek transaksi. Biasanya, dapat menentukan atribut isolasi transaksi, atribut propagasi, batas waktu, dan hanya membaca atribut ini.
Manajemen transaksi spesifik Spring mengharuskan PlatformTransactionManager untuk dikonfigurasi dalam file konfigurasi. Berikut ini adalah konfigurasi pegas yang sesuai dengan berbagai jenis transaksi.
Konfigurasi manajer transaksi lokal dari sumber data JDBC adalah sebagai berikut:
<!-Tentukan sumber data sumber data, gunakan sumber data C3P0 untuk mengimplementasikannya, dan menyuntikkan informasi yang diperlukan dari sumber data-> <bean id = "dataSource" hancurkan = "tutup" p: driverclass = "com.mysql. P: MAXPOOLSIZE = "40" P: MINPOOLSIZE = "2" P: InitialPoolSize = "2" P: MaxIdletime = "30" /> <!-Mengkonfigurasi Data Manager lokal untuk sumber data JDBC, gunakan DataSourCetRansactionManager Class-> <bean id = "transactionManager" P: DataSource-Ref = "DATAS" /"DATAS" /"TransactionManager" P: DataSource-REF = "DATAS" /"DATAS" /"TransacticManager" P: DATASOURCE-REF = "" DATAS "" DATAS " /" DATASAGER "P: DATASOUSOURCE =" "DATAS" "DATAS" "DATASURCE =" DATASURCE = "DATASURCE =" DATASURCE = "
Konfigurasi Manajer Transaksi Global JTA untuk Manajemen Kontainer adalah sebagai berikut:
<bean id = "DataSource" p: jndiname = "jdbc /jpetstore" /> <!-Menggunakan kelas jtatransactionManager, kelas ini mengimplementasikan antarmuka PlatformTransActionManager-> <!-Menggunakan transaksi global JTA-Kontak Spring dapat memperoleh sumber daya transaksional dari Java EE dengan SENDIRI DENGAN SENDIRI DENGAN SENDIRI "DENGAN" DENGAN "TANPA DENGAN SENDIRI-TANP DENGAN JAVA TANPA DENGAN JAVA TANPA DENGAN SENDIRI DARI SENDIRI DARI SENDIRI DARI SENDIRI-
Untuk transaksi Global JTA, Anda hanya perlu menentukan kelas implementasi manajer transaksi JTATRANSACTIONMANGER. Container Spring akan mendapatkan sumber data dari server J2EE dengan sendirinya, tanpa injeksi eksplisit ke Manajer Transaksi.
Konfigurasi transaksi lokal musim semi berdasarkan teknologi kegigihan hibernate adalah sebagai berikut.
<!-Tentukan sumber data sumber data, gunakan sumber data C3P0 untuk mengimplementasikannya, dan menyuntikkan informasi yang diperlukan dari sumber data-> <bean id = "dataSource" hancurkan = "tutup" p: driverclass = "com.mysql. p: maxpoolsize = "40" p: minpoolsize = "2" p: initialpoolsize = "2" p: maxidletime = "30" /> <!-Tentukan sesi hibernate, sessionfactory perlu mengandalkan sumber data, suntikan data /data-ref-<bean id = "sessionfactory" p: p: p: p: p: dATas-ref-ref-DATASE-> <bean id = "sessionfactory" p: p: p: p: dATASECECE- "DATASE-> <bean ID =" SESSIONFACTORY "P: P: DATASECE-" DATASE- " used to list all persistent classes --> <property name="annotatedClasses"> <list> <!-- The following is used to list all PO classes --> <value>com.entity.User</value> </list> </property> <!-- Define the sessionFactory property of Hibernate--> <property name="hibernateProperties"> <props> <!-- Specify the connection dialect of Hibernate--> <prop key = "hibernate.dialect"> org.hibernate.dialect.mysql5innodbdialect </por> <!-apakah akan membuat tabel data berdasarkan tabel pemetaan hibernasi-> <prop key = "hibernate.hbm2dl.Auto"> update </pop> </props> forcan.hbm2dl.Auto "> update </pop> </props> fornate.hbm2dl.Auto"> update </pop> </props> props> fornate. Kelas HibernatetRansactionManager-> <!-Kelas ini adalah implementasi khusus dari antarmuka PlatformTransActionManager untuk Hibernate-> <!-Mengkonfigurasi HibernatetRansactionManager membutuhkan Sesi
Jika transaksi musim semi mengadopsi kebijakan hibernasi, tiga poin umumnya diperlukan untuk mengonfigurasi: sumber data, sessionfactory, dan transaction manager.
Jika lapisan yang mendasarinya menggunakan teknologi lapisan persistensi hibernate dan transaksi menggunakan transaksi JTA Global, konfigurasinya adalah sebagai berikut:
<!-Konfigurasikan sumber data JTA-> <bean id = "DataSource" p: jndiname = "jdbc /jpetstore" /> <!-tentukan hibernate sessionFactory. SessionFactory perlu mengandalkan sumber data dan menyuntikkan DataSource-> <bean id = "sessionFactory" P: DataSource-Ref = "DataSource"> <!-Klass Anotasi Digunakan untuk mendaftarkan semua kelas yang persisten-> <Name Property = "AnnotatedClasses"> <List> <list> <!-Nilai PO FORMER> DAFTERNITY-> COM. </property> <!-Tentukan properti sesiFactory hibernate-> <name properti = "hibernateProperties"> <tops> <!-Tentukan dialek koneksi hibernate-> <prop key = "hibernate.dialect"> org.hibernate.dialect.mysql5innodbdial </org. -> <prop key = "hibernate.hbm2ddl.auto"> update </prop> </props> </prop Propert> </ bean> <!-Gunakan kelas JTATRANSACTIONMANGERAGER, yang merupakan kelas implementasi dari PlatformTransactionManager Interface-> <!-Implementasi spesifik untuk manajemen transaksi global-> <Bean ID = "
Dibandingkan dengan transaksi pegas berbasis hibernate sebelumnya, ini adalah untuk mengganti sumber data dengan sumber data JNDI dan mengganti manajer transaksi dengan JTATRansactionManager.
Untuk transaksi global JTA, karena dukungan dari server aplikasi yang mendasarinya diperlukan, mungkin ada perbedaan dalam rincian antara transaksi global JTA yang disediakan oleh server aplikasi yang berbeda. Oleh karena itu, ketika benar -benar mengkonfigurasi Global Transaction Manager, Anda mungkin perlu menggunakan subkelas JTATRANSACTIONMANAGER, seperti OC4JTatRansactionManager yang disediakan oleh Oracle's Javaee Application Server, WebLogicjtatransactionManager yang disediakan oleh Oracle untuk WebLogic, WebSphereowRansaction yang disediakan oleh IBMER untuk Websphere, WebSphereUowRansaction yang disediakan oleh IBMER untuk Websphere, dll. D.
Dari konfigurasi pegas dari berbagai jenis transaksi di atas, dapat dilihat bahwa ketika aplikasi mengadopsi manajemen transaksi pegas, aplikasi tidak perlu digabungkan dengan API transaksi spesifik. Aplikasi hanya perlu diprogram ke antarmuka PlateGransactionManager. ApplicationContext akan memilih kelas implementasi kebijakan transaksi yang sesuai (mis.
Jadi secara rinci bagaimana melakukan pemrograman kontrol transaksi di musim semi, biasanya ada dua cara.
Manajemen Transaksi Pemrograman: Ini adalah untuk secara langsung menggunakan tiga metode abstrak yang disediakan oleh PlataCransactionManager untuk mengontrol aliran transaksi dalam kode. Anda juga bisa mendapatkan kacang dari tipe PlatormTransactionManager di Wadah Musim Semi. Kacang ini selalu merupakan contoh dari kelas implementasi spesifik dari PlataCransactionManager. Kelas implementasi spesifik dipilih oleh ApplicationContext sesuai dengan pola kebijakan. Pemrogram tidak perlu peduli tentang hal itu, mereka hanya perlu memprogram berorientasi antarmuka.
Manajemen Transaksi Deklaratif: Metode ini tidak memerlukan proses kontrol transaksi untuk ditulis ke dalam kode, tetapi menggunakan AOP untuk menyelesaikan penggabungan transaksi sepenuhnya melalui file konfigurasi. Artinya, file konfigurasi XML dapat mengkonfigurasi agen transaksi untuk komponen bisnis, dan agen transaksi memberikan kontrol transaksi untuk komponen bisnis. Sekarang metode ini adalah yang terbaik, dengan intrusi kode sumber terendah.
Saat menggunakan transaksi deklaratif, Anda hanya perlu menulis file konfigurasi dan mengkonfigurasi jenis komponen yang memerlukan kontrol transaksi. Komponen bisnis akan ditenun ke dalam kontrol transaksi di bawah mekanisme AOP, dan pemrogram tidak perlu menulis kode manajemen transaksi apa pun dan dapat fokus pada pengembangan komponen bisnis. Oleh karena itu, manajemen transaksi deklaratif umumnya direkomendasikan.
Metode skema XML Spring menyediakan strategi konfigurasi transaksi ringkas. Ini mengkonfigurasi pemrosesan peningkatan transaksi melalui namespace <tx:advice> , di mana berbagai atribut transaksi dapat ditentukan (seperti atribut isolasi, atribut propagasi, batas waktu, tag-weeAing, dan kemudian mengkonfigurasi. ke dalam operasi transaksi. Berikut adalah contoh sederhana, mengkonfigurasi newsdaoImpl bean untuk operasi data, menggunakan sumber data C3P0, manajer transaksi JDBC Spring, dan mengatur properti untuk transaksi di <tx: nasihat.
Konfigurasi pegas lengkap adalah sebagai berikut:
<? Xml Version = "1.0" encoding = "UTF-8"?> <beans xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://www.springframework/org/orga/beans" xmlns: p = "http://www.springframework.org/schema/p" xmlns: aop = "http://www.springframework.org/schema/aop" xmlns: tx = "http:/schema.org.sok.gwork.org.gwork.org.org.org.org.org.org.org.sework.org.org.org.gework.org.org.org.gework.org.org.org.org.org.org.gework.org.orgad XSI: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http:/wwww.springfram http://www.springframework.org/schema/aop http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/schema/tx:tx.4 bean, use the C3P0 data source to implement it, and inject the necessary information of the data source --> <bean id="dataSource" destroy-method="close" p:driverClass="com.mysql.jdbc.Driver" p:jdbcUrl="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=UTF-8" p:user="root" p:password="" p:maxPoolSize="40" p:minPoolSize="2" p:initialPoolSize="2" p:maxIdleTime="30" /> <!-- Configure the local data manager of JDBC data source, use the DataSourceTransactionManager class --> <bean id="transactionManager" p:dataSource-ref="dataSource" /> <!-- Configure a business logic bean --> <bean id="newsDao" p:ds-ref="dataSource" /> <!-- Configure transaction enhancement processing, specify transaction manager --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <!-- Used to configure detailed transaction definitions --> <tx:attributes> <!-- All methods starting with get are read-only-> <tx: Metode name = "get*" read-only = "true" /> <!-Semua metode lain dapat transaksi secara default, menentukan batas waktu 5 detik-> <tx: metode metode = "*" isolasi = "tx: a attibute =" tx: a. Eksekusi semua metode di semua kelas impl-end di bawah paket IMP-> <aop: pointcut ekspresi = "eksekusi (*com.dao.impl.*Impl.*(..))" id = "mypointcut" /> <!-mengikat poin masuk mypointcut dan txadadpute "poin" poin "mypoP (> <aop: advisor advisor nasihat =" pointcut "mypoint" mypoCad "poin" mypoP (AOP: advisor advisor nasihat = "TXPOint" mypoint "mypoCad" "TXAdad" <AOP: Advisor Advisor Advisor = "TXPOINT" MYPOPOCE /POINT "TXADVICE" "POINT" POINT "POINT" POINT "POINT" TXADPLET " Titik masuk agar sesuai dengan eksekusi semua metode di kelas yang dimulai dengan ABC di bawah paket IMP -> </aop: config> </boy>
Dalam kode newsdaoImpl, itu untuk memasukkan data duplikat ke dalam tabel.
Paket com.dao.impl; impor javax.sql.datasource; impor org.springframework.jdbc.core.jdbctemplate; impor com.dao.newsdao; kumpulan public newsdaoCled (datasdao {datasource private datas; batal insert (string title, konten string) {// penggunaan kumpulan data c3p0 jdbctemplate jt = new jdbctemplate (ds); jt.update ("masukkan ke news_inf" + "values (100,?), judul,? kontrol, catatan pertama dapat dimasukkan // jika kontrol transaksi ditambahkan, catatan pertama tidak akan dimasukkan}}Ini metode pengujiannya.
public static void test3 () {ApplicationContext ctx = new ClassPathXMLapPlicationContext ("beans4jdbc.xml"); // Dapatkan agen transaksi bean newsdao dao = (newsdao) ctx.getbean ("newsdao", newsdao.class); Dao.insert ("Ide Inti Pemrograman Java", "Pengembangan Java EE Ringan"); System.out.println ("Eksekusi selesai"); }Melaksanakan metode pengujian akan menemukan bahwa pengecualian dilemparkan (karena data duplikat) dan karena kontrol transaksi, tidak akan ada penyisipan data dalam database.
Seperti yang dapat Anda lihat dalam contoh di atas, biasanya dalam konfigurasi skema XML, konfigurasi AOP sebenarnya dilakukan untuk kacang biasa, dan peningkatan saran dimasukkan. Peningkatan saran dikonfigurasi dengan manajer transaksi, yang bergantung pada sumber data.
Untuk <AOP: Advisor>, ikatan nasihat dan titik masuk dilakukan oleh postprocessor kacang di bagian bawah musim semi (seperti beannameautoproxycreator, defaultAdvisorAutoproxycreator), yang pada dasarnya adalah proxy yang dinamis.
Selain itu, dalam peningkatan konfigurasi <tx: nasihat>, Anda juga dapat menentukan bahwa ketika pengecualian tertentu ditemui, paksa rollback dan paksa tidak rollback, yaitu, rollback-for = "xxxexception", no-rollback-for = "xxxexException"
Selain menggunakan metode skema XML, Anda juga dapat secara langsung menambahkan anotasi @transaction ke metode untuk membuat metode ini memiliki sifat transaksional. Di @Transaction, berbagai properti dapat dikonfigurasi untuk transaksi (seperti properti isolasi, properti propagasi, batas waktu, properti baca saja, dll.). Selain itu, perlu untuk menambahkan konfigurasi <tx: anotasi yang ditimbulkan ke konfigurasi XML, menunjukkan bahwa pegas akan mengkonfigurasi agen transaksi sesuai dengan anotasi, sehingga konfigurasi properti dari transaksi dan konfigurasi pemotongan AOP dapat diselesaikan hanya dalam satu langkah (langsung melalui konfigurasi anotasi pada nama metode).
<tx: transaksi-transaksi-manager-manager = "transactionManager" />
NewsdaoImpl.
@Transactional (propagation = propagation.Required, isolation = isolation.default, timeout = 5) @Overridepublic void insert (string title, string content) {Di atas adalah seluruh konten artikel ini tentang kode contoh mekanisme transaksi Spring, 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!