多數據源事務控制
最近遇到了一個多數據源事務的同步問題,業務模型很簡單,就是讀取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的聲明式事務是一樣的,只不過他們各有利弊,編程式事務靈活,和比較精確的控制事務的每一個部分,但是代碼量可能多一點,而聲明式事務一個注解就可以完成,事務也可以比較精確的控制,但是聲明式事務控制的最小范圍是一個方法體,而遇到多個諸如事務的同時控制的時候就顯得有點力不從心了。
參考鏈接: