Spring 3.0.6 多数据源事务解决方案

今天遇到了多数据源的问题,原因是一部分统计数据希望记录到另一个库,用于后台系统统计,而不影响游戏数据的正常运行,通过google搜索,大部分的解决方案都是需要使用那个jta才能进行多数据源的事务提交,但是这个要对原有的系统进行修改,实在是比较危险,谨慎的我,感觉使用编程式事务会让代码变得简单,下面介绍spring3中的编程式事务用法:
@Resource
private PlatformTransactionManager transactionManager2;

public int insert_credit_record(String order_num,int uid,int level ,int num){
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
         TransactionStatus status=transactionManager2.getTransaction(def);
         try {
        Stat_credit_recordManager stat_credit_recordmanager = (Stat_credit_recordManager) BaseAction.getInstance().getBean("stat_credit_recordManager");
       int r=stat_credit_recordmanager.credit(order_num, uid, level, num);
       return r;
         } catch (RuntimeException e) {
        transactionManager2.rollback(status);
             e.printStackTrace();
             return -1;
         } finally {
        transactionManager2.commit(status);
         }
      
}
看到@Resource ,大家应该知道这个 transactionManager2 已经在spring容器中定义过了, 下面看下他的配置。
<!-- 后台数据库事务代理 -->
<bean id="transactionManager2"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref local="managerDataSource" />
</property>
<qualifier value="ibeshmet"/> 
</bean>
可以看出来,他还被定义为 <qualifier value="ibeshmet"/> 
也就是说,在声明式事务中 ,使用@Transactional("ibeshmet")
可以切换到这个事务管理下,但是很可惜的是,当一个事务中使用了两个以上的数据源的时候,还是只能提交一个数据源事务,而且不会报错。
无奈之下,我把次要的数据源,通过编程式事务实现了。
巧妙的躲开了jta配置,和大量的修改,看了下代码,也只是多了几行,还是很优雅。。。

猜你喜欢

转载自vanadiumlin.iteye.com/blog/1168376