【问题标题】:Spring transactions on recursive calls递归调用上的 Spring 事务
【发布时间】:2013-02-28 16:50:37
【问题描述】:

我有一个使用 Spring 的事务模板以编程方式启动事务的方法。

Void methodA() {
    TransactionTmeplate..........

    Setpropgation to requires new....

    /// do my stuff in trasaction


}

因此,如果我有另一个类调用此方法,它会创建一个事务,正如我所期望的那样。但是如果从同一个调用线程再次进入这个方法会发生什么。是否创建了另一个事务?

例子:

MethodCaller -> methodA (transaction created) -> methodD -> methodA(??)

接下来:

如果类是@autowired,考虑到一个实例存在,两个调用线程是否会共享同一个事务?

我会假设没有,因为他们在该方法的堆栈上有自己的条目。

【问题讨论】:

  • 什么样的逻辑可以完成这样的事情?交易应该是一个单一的逻辑部分。我会说这有代码味道
  • 是的,我同意......但我试图遵循一些代码和行为......看起来像这样......因为我再次写它......我想确定交易和它们是如何工作的......有什么可能什么不是......

标签: java spring transactions


【解决方案1】:

Propagation.REQUIRES_NEW 上的 javadoc 很清楚,我不确定是否可以更好地解释。

至于调用您的方法的不同线程:TransactionManager 将确保线程在事务方面不会相互交错。

但是拥有一个可重入且总是启动新事务的方法表明您的应用程序没有正确分层。尝试进行一些重构,并确保负责启动新事务的方法永远不会被递归调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-17
    • 2019-10-18
    • 2011-09-16
    • 1970-01-01
    • 2016-08-20
    • 2014-07-07
    • 2015-03-11
    • 2016-03-21
    相关资源
    最近更新 更多