【问题标题】:Multiple transaction manager with multiple session factories具有多个会话工厂的多个事务管理器
【发布时间】:2016-11-18 07:37:41
【问题描述】:

我的基本要求是有多个 sessionFactory 对象指向两个不同的模式(这是逻辑分组,每个逻辑组都有多个模式),所以这里是配置:

<tx:annotation-driven transaction-manager="transactionManager1" />
<transactionManager1>
  <sessionFactory1>
</transactionManager1>

<tx:annotation-driven transaction-manager="transactionManager2" />
<transactionManager2>
  <sessionFactory2>
</transactionManager2>

现在我创建了具有保存方法的 Dao 类

@Transactional
public void save(Object){
   sessionFactory2.getCurrentSession().save(object);
}

这段代码运行良好,但我的问题是,@Transactional 注释将选择哪个事务管理器?

或者有办法在日志中打印它?

【问题讨论】:

  • 如果我可以改变@transactional注解的逻辑,也请提出建议。
  • 在你的情况下 transactionManager2... 拥有多个 &lt;tx:annotation-driven /&gt; 元素没有意义,而且毫无用处。最后一个是有效的。当您指定一个特定的transaction-manager 时,如果@Transactional 注释中没有明确定义,则默认使用该transaction-manager

标签: spring transactions


【解决方案1】:

如果您发布的(伪)配置也是您在配置中定义的顺序,那么将始终使用transactionManager2

定义多个&lt;tx:annotation-driven /&gt; 元素没有用。使用此元素,您表明您想要使用注释驱动的事务,并且您想要使用给定的transaction-manager 作为默认事务管理器。

在您的情况下,您定义了 2,最后一个将是有效的。

当使用多个事务管理器时,您必须在 @Transactional 注释中指定用于该特定事务方法的事务管理器。

因此,您需要指定@Transactional("transactionManager1")@Transactional("transactionManager2"),具体取决于您将哪一个视为默认值。

【讨论】:

  • 感谢 Deinum,现在我可以想象后台进程了。但是在看完你的回答之后,我又想到了两个问题:1.我们是否有任何流程可以在应用注释时动态选择事务管理器? 2. 我们在事务管理器中设置的 sessionFactory 实例有什么用。因为在这种情况下,可能会在使用 sessionFactory1 保存实体时应用 transactionManager2,而 sessionFactory1 和 transactionManager2 没有任何关系。
【解决方案2】:

你可以通过在注解中传递它的名字来指定事务管理器给你 例如:

@Transactional(value="transactionManager2")
public void save(Object){
   sessionFactory2.getCurrentSession().save(object);
}

您可以在这里找到更多详细信息http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html

希望有用

安杰洛

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2014-05-27
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多