多数据源事务控制
多数据源事务控制
最近遇到了一个多数据源事务的同步问题,业务模型很简单,就是读取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的声明式事务是一样的,只不过他们各有利弊,编程式事务灵活,和比较精确的控制事务的每一个部分,但是代码量可能多一点,而声明式事务一个注解就可以完成,事务也可以比较精确的控制,但是声明式事务控制的最小范围是一个方法体,而遇到多个诸如事务的同时控制的时候就显得有点力不从心了。
参考链接: