多數據源事務控制


多數據源事務控制

背景

最近遇到了一個多數據源事務的同步問題,業務模型很簡單,就是讀取A數據庫的數據,然后根據一定的映射規則插入到B數據庫中,但是要保證從A數據庫同步的數據到B數據庫的數據和A完全一樣。這樣就需要有事務的控制。但是Spring的聲明式事務只能控制單個數據庫的事務問題,而由於系統中這塊的內容比較少,又不想引入注入MQ和分布式事務的組件,所以選擇了使用Spring的編程式事務手動控制事務的問題。

Spring利用PlatformTransactionManager控制事

  

事務控制步驟

1:首先配置兩個事務管理器transactionManager1,transactionManager2

2:把事務管理器注入大兩個變量中

3:統一手動控制事務

代碼控制的邏輯如下:

@Resource
@Qualifier("transactionManager1")
private PlatformTransactionManager txManager1;
@Qualifier("transactionManager2")
@Resource
private PlatformTransactionManager txManager2;

 

DefaultTransactionDefinition def1 = new DefaultTransactionDefinition(); 
// explicitly setting the transaction name is something that can be done only programmatically 

def1.setName("SomeTxName"); 
def1.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status1 = txManager1.getTransaction(def1);


DefaultTransactionDefinition def2 = new DefaultTransactionDefinition(); 
// explicitly setting the transaction name is something that can be done only programmatically 

def2.setName("SomeTxName"); 
def2.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status2 = txManager2.getTransaction(def2);


//統一進行事務控制
try {
    // put your business logic here
    executeDataSource1(txManager1,otherParams);
    executeDataSource2(txManager2,otherParams);
}
catch (MyException ex) {
    txManager1.rollback(status1);
    txManager2.rollback(status2);
    throw ex;
}
txManager1.commit(status1);
txManager2.commit(status2);

總結

其實這和利用Spring的聲明式事務是一樣的,只不過他們各有利弊,編程式事務靈活,和比較精確的控制事務的每一個部分,但是代碼量可能多一點,而聲明式事務一個注解就可以完成,事務也可以比較精確的控制,但是聲明式事務控制的最小范圍是一個方法體,而遇到多個諸如事務的同時控制的時候就顯得有點力不從心了。

參考鏈接:

https://docs.spring.io/spring-framework/docs/current/reference/html/data-access.html#tx-multiple-tx-mgrs-with-attransactional

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM