Loading

多数据源事务控制

多数据源事务控制

背景

最近遇到了一个多数据源事务的同步问题,业务模型很简单,就是读取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

 

 

posted @ 2021-01-25 11:54  Philosophy  阅读(2713)  评论(0编辑  收藏  举报