【问题标题】:Which propagation to use in Spring?在 Spring 中使用哪种传播?
【发布时间】:2015-09-03 13:39:00
【问题描述】:

我有两个不同的进程(A和B),A必须在B之后开始,B不能加入A的事务,B必须等到A完成提交。

我应该使用什么传播?

现在是这样的:

@Transactional
A()

@Transactional
B()

现在我使用它默认@Transactional,它不能正常工作。我想我应该使用 PROPAGATION

我希望问题很清楚。 提前致谢。

【问题讨论】:

    标签: java spring spring-transactions


    【解决方案1】:

    如果B() 在其事务上下文中调用A(),则A() 应使用REQUIRES_NEW 传播以拥有自己的独立事务。

    根据spring框架的Data Access Section

    PROPAGATION_REQUIRES_NEW 与 PROPAGATION_REQUIRED 相比,使用 每个受影响的交易完全独立的交易 范围。在这种情况下,基础的实物交易是 不同,因此可以独立提交或回滚,具有 外部事务不受内部事务回滚的影响 状态。

    【讨论】:

    • 如果我对 A() 使用 requires_new,它拥有自己的事务 OK,但 B() 必须在 A() 完成提交时启动,在这种情况下,它是否可以这样工作? B() 是否等待 A() 的提交?
    • 如果B() 以同步方式调用A(),是的,它会等待A()。否则,调用A() 会产生一个线程并立即返回。
    【解决方案2】:

    这张照片几乎可以告诉您为什么应该使用 REQUIRES_NEW。你想要的是调用总是发生在一个新的事务(TX)上下文中。

    但是请注意:实际的事务暂停不适用于所有事务管理器的开箱即用。如果您使用的是JtaTransactionManager,则需要将javax.transaction.TransactionManager 提供给它。

    【讨论】:

    • 好吧,我明白为什么我必须使用 REQUIRES_NEW,但我担心 B() 必须在 A() 之后开始,REQUIRES_NEW 可以这样做吗?
    • 是的。只要您正确编写事务,它就应该起作用。您还可以在 @Transactional 中使用 timeout 属性将 B() 超时特定毫秒。
    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2017-09-08
    相关资源
    最近更新 更多