使用Spring @Transactionnal,Spring如何知道要使用哪个数据源?

时间:2012-10-16 14:54:06

标签: java spring hibernate transactions mybatis

在Spring中使用@Transactionnal时

  • 如何选择应该打开交易的数据源?

  • 是否有代理,threadlocals或其他任何神奇的技巧?

  • 如果是这样,这些技巧是否适用于任何JDBC库(对于Hibernate,它可以工作,但MyBatis呢?)

  • 如果有2个数据源怎么办?

  • 如果我在@Transactionnal服务中调用带有2个底层不同数据源的DAO,该怎么办?它是两个数据源的事务处理还是仅针对其中一个数据源还是会失败?

由于

2 个答案:

答案 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类而不是稍低级别的代码。