spring 配置多数据源问题,如何彼此隔离互相不影响

配置2个数据源,事物切面配置:“事物添加方法前缀”配置相同并且“事物的切入点”如下配置,如果其中任何一个数据源连接不上事物提交不了,数据保存不成功
    事物添加方法前缀:
第一个:方法前缀:save
<tx:advice id="shardTxAdvice" transaction-manager="shardTransactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception" />
..........
..........
</tx:attributes>
</tx:advice>

第二个:方法前缀:save
<tx:advice id="qualTxAdvice" transaction-manager="qualTransactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception" />
.........
.........
</tx:attributes>
</tx:advice>

事物的切入点:
<aop:config>
<aop:pointcut id="bizMethods"
expression="execution(* com.cn.*.service.*.*(..)) or execution(* com.cn.*.*.service.*.*(..)) or execution(* com.cn.*.*.*.*(..))" />
<aop:advisor advice-ref="shardTxAdvice" pointcut-ref="bizMethods" />
<aop:advisor advice-ref="qualTxAdvice" pointcut-ref="bizMethods" />
</aop:config>


方案一:
如果确定了,其中一个数据源只查询使用没有数据维护,不为其配置事物。

方案二:
如果2数据源都需要对数据维护,同时保证2个数据源的事物对所有的服务层一致,可以将2个数据源的事物添加方法前缀配置的不一样.
这种情况下,试验中证明:
1:单独操作其中一数据源的方法开启事物,其他数据源连接失败也不相互影响,
2:操作2个数据源的方法,其中任何一个数据连接失败,事物仍然会回滚。
事物添加方法前缀:
第一个:方法前缀:save
<tx:advice id="shardTxAdvice" transaction-manager="shardTransactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception" />
..........
..........
</tx:attributes>
</tx:advice>

第二个:方法前缀:qual_save
<tx:advice id="qualTxAdvice" transaction-manager="qualTransactionManager">
<tx:attributes>
<tx:method name="qual_save*" propagation="REQUIRED" read-only="false"
rollback-for="java.lang.Exception" />
.........
.........
</tx:attributes>
</tx:advice>

事物的切入点:不变,保证2个数据源事物对“所有的服务层一致”
<aop:config>
<aop:pointcut id="bizMethods"
expression="execution(* com.cn.*.service.*.*(..)) or execution(* com.cn.*.*.service.*.*(..)) or execution(* com.cn.*.*.*.*(..))" />
<aop:advisor advice-ref="shardTxAdvice" pointcut-ref="bizMethods" />
<aop:advisor advice-ref="qualTxAdvice" pointcut-ref="bizMethods" />
</aop:config>

方案三:事物添加方法前缀相同,修改不同事物的切入点,
Spring的AOP应该是可以把不同的事物,插入到不同的类和方法中。
<!-- 事务范围aop--> 指定包下某个类的方法使用新的数据源事物
<aop:config>
<aop:pointcut id="bigbizMethods"
expression="execution(* com.cn.sp.sc.service..CouponBigDataService.*(..))" />
<aop:advisor advice-ref="qualTxAdvice" pointcut-ref="bigbizMethods" />
</aop:config>



也许有更好的方案解决,我实验是这3种情况下的方法

猜你喜欢

转载自blog.csdn.net/changqiao211sdn/article/details/51705658
今日推荐