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配置,和大量的修改,看了下代码,也只是多了几行,还是很优雅。。。