编程式的事务控制很简单.
注解的方式如何操作呢?
比如我有两个数据源,一个是datasouce-vancl-union,一个是datasource-scm
那么就会产生两个sessionfactory,一个叫sessionfactory-vancl-union,一个叫sessionfactory-scm
那么我们就会有两个transactionmanager,一个叫transactionmananger-vancl-union,一个叫transactionmanage-scm.
由于注解的方式,只能声明一个transactionmananger,如下:
<!-- 通过@Transactional注解定义事务--> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
那么意味着,我们访问另外一个数据源的时候,程序无法对其访问进行事务控制.
怎么解决呢?
我的解决方案如下:
首先给两个transactionmanager起个别名:
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> <qualifier value="txManager" /> </bean> <bean id="transactionManagerScm" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="readSessionFactory" /> <qualifier value="txManagerScm" /> </bean>
然后在需要用的事务注解的service类或者方法的@Transactional注解里面加入 value=?? ,用到哪个transactionmanager
就输入哪个的别名.
但是要注意,如果你这个方法里面的sessionfactory如果不是这个transactionmanager管理的sessionfactory的话,
事务配置是无效的.也就是说和没有配置事务一样.
如果想用一个事务控制多个数据源,可以用JTA事务.