4

将 @Transactionnal 与 Spring 一起使用时

  • 它如何选择应该在其上打开事务的数据源?

  • 有没有像代理、threadlocals 之类的魔术?

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

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

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

谢谢

4

2 回答 2

3

要使用多个事务处理程序,只需指定一个限定符并引用它。对于具有两个不同数据源的两个不同 DAO,您将需要两个不同的事务管理器。当然,事务应该在您的服务类上进行,而不是直接在 DAO 上进行。它对于任何类型的事务管理器都是一样的,无论是休眠的还是普通的旧 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 设置一个数据源,然后您可以在代码中使用限定符 name 引用 transactionmanager:

@Transactional(value = "One")
于 2012-10-16T15:15:37.077 回答
1

我可以提供一个部分答案,通常当您使用PlatformTransactionManagerSpring 中的 a 时,它在创建时与单个数据源相关联。像这样的东西:

@Bean public PlatformTransactionManager txManager() { 
  return new HibernateTransactionManager(sessionFactory()); 
}

配置SessionFactory有数据源。我怀疑如果你想拥有多个PlatformTransactionManagers 那么你不能像我上面所做的那样仅仅依靠自动装配它们作为 bean。您可能不得不改用TransactionTemplate该类并在稍低的级别上编写代码。

于 2012-10-16T15:07:11.623 回答