項目進行讀寫分離及分庫分表,在一個業務中,在一個事務中處理時候将切換多個資料源,需要保證同一事務多個資料源資料的一緻性。此處使用atomikos來實作:最後附源碼:
1:spring3.0之後不再支援jtom[jta]了,第三方開源軟體atomikos(http://www.atomikos.com/)來實作.
2:org.springframework.transaction.jta.jotmfactorybean類,spring-tx-2.5.6.jar中有此類,spring-tx-3.0.0.release.jar之後沒有此類。
3:atomikos事務控制架構,其中看到有3種資料源,分别是,simpledatasourcebean,atomikosdatasourcebean,atomikosnonxadatasourcebean。
a:simpledatasourcebean: 這個是最簡單地資料源配置,需要配置xa驅動。
b:atomikosdatasourcebean: 分布式資料源,atomikos實作的資料源,需要配置xa驅動,推薦此配置,可以配置連接配接池的資訊。
c:atomikosnonxadatasourcebean: 非分布式資料源,該資料源配置需要普通jdbc的驅動,可以配置連接配接池:
4:atomikos支援xa(全局事務)和non-xa(非全局事務),non-xa[nonxadatasource]效率高于xa.xa事務往往是包括多個資料源的全局事務,非xa是單個資料源的.
5:xa連接配接是一個jta事務中的參與者。xa連接配接不支援jdbc的自動送出特性。也就是說應用程式不必在xadatasource[xa]連接配接上調用java.sql.connection.commit()或java.sql.connection.rollback();而應用程式應該使用usertransaction.begin(),usertransaction.commit()和usertransaction.rollback().
看看pom.xml依賴:
1:atomikosdatasourcebean[xa(全局事務)]資料源配置datasource-context.xml:
2:spring主配置檔案spring-context.xml:
3:資料源配置參數database.properties:
4:mybatis的配置mybatis-context.xml:
配置mybatis-config(此代碼,隻為測試分布式事務,并不涉及真實的業務!!!):
mybatis-config-master.xml:
mybatis-config-slave.xml
5:mapper的管理及注入,為mybatis的dao層mapper接口注入[綁定]sqlsessionfactory:
6:atomikos事務配置transaction-context.xml:
7:配置jta啟動參數在src下,最後追加詳細:
8:代碼(部分不涉及代碼已删除):
a:mybatis的mapper和dao接口[membermapper/memberinfomapper]:
b:服務層接口和實作:
c:junit測試代碼:
效果圖:
執行前,master資料庫:
執行前,slave資料庫:
執行後,master資料庫:
執行後,slave資料庫:
spring-tx-2.5.6.jar和spring-tx-3.0.0.release.jar目錄:
jta.properties啟動參數: