在Spring中使用@Transactionnal时
如何选择应该打开交易的数据源?
是否有代理,threadlocals或其他任何神奇的技巧?
如果是这样,这些技巧是否适用于任何JDBC库(对于Hibernate,它可以工作,但MyBatis呢?)
如果有2个数据源怎么办?
如果我在@Transactionnal服务中调用带有2个底层不同数据源的DAO,该怎么办?它是两个数据源的事务处理还是仅针对其中一个数据源还是会失败?
由于
答案 0 :(得分:3)
要使用多个事务处理程序,只需指定限定符,然后引用它。对于具有两个不同数据源的两个不同DAO,您将需要两个不同的事务管理器。当然,交易应该在您的服务类上进行,而不是DAO直接进行。它适用于任何类型的事务管理器,无论是hibernate还是普通的旧jdbc。
<bean id="transactionManagerOne"
class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactoryOne">
<qualifier value="One" />
</bean>
和会话工厂
<bean id="sessionFactoryOne"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:dataSource-ref="dataSourceOne"
只需使用ID dataSourceOne设置数据源,然后使用限定符名称在代码中引用transactionmanager:
@Transactional(value = "One")
答案 1 :(得分:1)
我可以提供部分答案,通常当您使用Spring的PlatformTransactionManager
时,它在创建时与单个数据源相关联。像这样:
@Bean public PlatformTransactionManager txManager() {
return new HibernateTransactionManager(sessionFactory());
}
SessionFactory
配置了数据源。我怀疑如果你想拥有多个PlatformTransactionManager
,那么你不能仅仅依靠像我上面那样自动装配它们。您可能必须使用TransactionTemplate
类而不是稍低级别的代码。