天天看點

Spring多資料源分布式事務管理/springmvc+spring+atomikos[jta]+druid+mybatis

項目進行讀寫分離及分庫分表,在一個業務中,在一個事務中處理時候将切換多個資料源,需要保證同一事務多個資料源資料的一緻性。此處使用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測試代碼:

Spring多資料源分布式事務管理/springmvc+spring+atomikos[jta]+druid+mybatis

效果圖:

執行前,master資料庫:

Spring多資料源分布式事務管理/springmvc+spring+atomikos[jta]+druid+mybatis

執行前,slave資料庫:

Spring多資料源分布式事務管理/springmvc+spring+atomikos[jta]+druid+mybatis

執行後,master資料庫:

Spring多資料源分布式事務管理/springmvc+spring+atomikos[jta]+druid+mybatis

執行後,slave資料庫:

Spring多資料源分布式事務管理/springmvc+spring+atomikos[jta]+druid+mybatis

spring-tx-2.5.6.jar和spring-tx-3.0.0.release.jar目錄:

Spring多資料源分布式事務管理/springmvc+spring+atomikos[jta]+druid+mybatis
Spring多資料源分布式事務管理/springmvc+spring+atomikos[jta]+druid+mybatis

jta.properties啟動參數: