corbarclient支持spring3.X
来源:互联网 发布:中国 气候 变迁 知乎 编辑:程序博客网 时间:2024/05/03 07:54
问题:
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上
---------------------------------
本文转自:http://www.07net01.com/linux/CobarClientzhichiSpring3_xdefenxi_535616_1374057207.html
- corbarclient支持spring3.X
- 第八章 Spring 对 DAO 的支持 《Spring3.x》
- [Spring3.x] 第 8 章 Spring 对 DAO 的支持
- spring3.x第八章 Spring对DAO的支持
- spring3.x
- mule3.X + spring3.X
- Jersey支持spring3配置
- Spring3.x配置quartz
- Spring3.X第一次接触
- Spring3.x JSR-303
- spring3.x事务配置
- spring3.x注解配置
- spring3.x schemaLocation
- Spring3.x--自动检测Bean
- Spring3.x--Aop
- Spring3.x--注解切面
- Spring3.x--事务管理
- Spring3.x--SpringMVC
- mysql database中常用操作
- C#基础实践:引用与值类型
- Java程序计算对象所占内存的大小的方法
- 计数排序(Countsort)之Java实现
- 嵌入式 解决线程使用sleep或usleep等函数导致整个进程睡眠的问题
- corbarclient支持spring3.X
- PCB中的地线
- LeetCode Container With Most Water
- SQL Server中 DateDiff计算时间差
- 【mysql】表的创建以及基本操作
- BeagleBone Black 高清照片两张
- EFI安装64位系统
- HTML5 API --- 页面可见性改变(visibilitychange)事件
- 题目1010:A + B