corbarclient支持spring3.X


问题: 

CobarClient(https://github.com/alibaba/cobarclient 下面简称CC)在Spring2.5下的 配置 事务管理器 
1 <bean id="transactionManager"
2     class="com.alibaba.cobar.client.transaction.MultipleDataSourcesTransactionManager">
3     <property name="cobarDataSourceService" ref="dataSources" />
4     <property name="globalRollbackOnParticipationFailure"value="http://chinalibra.iteye.com/blog/true" />
5 </bean>


但是在Spring3.x下面这样配置,在启动事务的时候,会有错误 
01 <a href="http://www.07net01.com/program/" target="_blank"><u>java</u></a>.lang.IllegalStateException: Cannot activate transaction synchronization - already active
02     at org.springframework.transaction.support.TransactionSynchronizationManager.initSynchronization(TransactionSynchronizationManager.<a href="http://www.07net01.com/program/" target="_blank"><u>java</u></a>:270)
03     at org.springframework.transaction.support.AbstractPlat<a href="http://www.07net01.com/program/" target="_blank"><u>for</u></a>mTransactionManager.prepareSynchronization(AbstractPlat<a href="http://www.07net01.com/program/" target="_blank"><u>for</u></a>mTransactionManager.java:537)
04     at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373)
05     at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:417)
06     at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:255)
07     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
08     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
09     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
10     at $Proxy10.createOffersInBatch(Unknown Source)
11     at com.alibaba.cobar.client.transaction.MultipleDataSourcesTransactionManagerTest.testOfferCreationOnMultipleShardsWithNormallyOfferService(MultipleDataSourcesTransactionManagerTest.java:94)


检查原因:  
启动事务的时候,TransactionManager会调用getTransaction方法初始化事务,这里面会调用子类的doBegin方法 
而MultipleDataSourcesTransactionManager(CC实现的子类)的doBegin方法中将调用各个实际数据源DataSourceTransactionManager的getTransaction方法,从而开启各个数据源的事务 
ps:其实最好做法是调用各个实际数据源的doBegin方法,但是因为这个方法是protected的,无法在外部调用,只能退而求其次,调用getTransacation方法。 

但是在新版spring下面,MultipleDataSourcesTransactionManager的抽象类AbstractPlatformTransactionManager进行了重写 
getTransaction方法内部在调用doBegin之后又调用了prepareSynchronization方法,这个方法会调用initSynchronization初始化一个ThreadLocal变量synchronizations 
在初始化之前会检查该变量是否已经初始化了,如果出现就报错。 
而CC的doBegin是调用了getTransaction,所以该变量会初始化多次,所以导致无法通过检查。 

但是如果我们把transactionManager 的transactionSynchronization设置为SYNCHRONIZATION_NEVER,就会避免initSynchronization重复初始化问题, 
因为MultipleDataSourcesTransactionManager的isNewSynchronization属性为false,initSynchronization就不会执行。 

Spring3.x中设置如下 : 
1 <bean id="transactionManager"class="com.alibaba.cobar.client.transaction.MultipleDataSourcesTransactionManager">
2 <property name="cobarDataSourceService" ref="dataSources" />
3 <property name="transactionSynchronization"value="http://chinalibra.iteye.com/blog/2" />
4 </bean>


TransactionSynchronization的含义: 
下面摘自网上的描述 
TransactionSynchronization是可以注册到事务处理过程中的回调接口。它就像是事务处理的事件监听器,当事务处理的某些规定时点发生时,会调用TransactionSynchronization上的一些方法来执行相应的回调逻辑,如在事务完成后清理相应的系统资源等操作。Spring事务抽象框架所定义的TransactionSynchronization类似于JTA规范的javax.transaction.Synchronization,但比JTA的Synchronization提供了更多的回调方法,允许我们对事务的处理添加更多的回调逻辑。  
具体我没有用过,我一直是使用默认的。 

可能导致的问题 : 
个人分析-不会,因为我们屏蔽的只是CC的MultipleDataSourcesTransactionManager的transactionSynchronization属性,而实际的数据源事务管理器的transactionSynchronization仍然是默认的SYNCHRONIZATION_ALWAYS。 

总结一下,可以这样认为,我们在CC中不支持transactionSynchronization特性。 
其实我们对MultipleDataSourcesTransactionManager设置的属性都没有应用到的数据源事务管理器DataSourcesTransactionManager上


---------------------------------

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值