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

yangjinpingc 2011-09-08

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

@Resource

privatePlatformTransactionManagertransactionManager2;

publicintinsert_credit_record(Stringorder_num,intuid,intlevel,intnum){

DefaultTransactionDefinitiondef=newDefaultTransactionDefinition();

TransactionStatusstatus=transactionManager2.getTransaction(def);

try{

Stat_credit_recordManagerstat_credit_recordmanager=(Stat_credit_recordManager)BaseAction.getInstance().getBean("stat_credit_recordManager");

intr=stat_credit_recordmanager.credit(order_num,uid,level,num);

returnr;

}catch(RuntimeExceptione){

transactionManager2.rollback(status);

e.printStackTrace();

return-1;

}finally{

transactionManager2.commit(status);

}

}

看到@Resource,大家应该知道这个transactionManager2已经在spring容器中定义过了,下面看下他的配置。

<!--后台数据库事务代理-->

<beanid="transactionManager2"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<propertyname="dataSource">

<reflocal="managerDataSource"/>

</property>

<qualifiervalue="ibeshmet"/>

</bean>

可以看出来,他还被定义为<qualifiervalue="ibeshmet"/>

也就是说,在声明式事务中,使用@Transactional("ibeshmet")

可以切换到这个事务管理下,但是很可惜的是,当一个事务中使用了两个以上的数据源的时候,还是只能提交一个数据源事务,而且不会报错。

无奈之下,我把次要的数据源,通过编程式事务实现了。

巧妙的躲开了jta配置,和大量的修改,看了下代码,也只是多了几行,还是很优雅。。。

相关推荐

方志朋 / 0评论 2020-04-17