【问题标题】:Will Spring transaction REQUIRES_NEW be propagated to the methods within the method?Spring 事务 REQUIRES_NEW 是否会传播到方法中的方法?
【发布时间】:2016-11-16 22:15:27
【问题描述】:

我的要求是从method2 提交/回滚更改,并且不依赖于外部事务。所以我使用REQUIRES_NEW 提交内部事务。 但我需要澄清一下其他方法在从该方法调用时将持有的传播类型。

@Transactional(propagation=Propagation.REQUIRES_NEW)
public String method1(long id) {
    ABC obj = method2(id);
    method3(obj);
    myDAO.saveOrUpdate(obj);
}

private ABC method2(long id) {
    ABC obj1 = myDAO.readData(id);
    ...
    ...
    return obj1;
}

private void method3(ABC obj) {
    ABC obj1 = (ABC)obj.clone();
    obj1.setId(123);
    obj1.setName("Name");
    myDAO.persist(obj1);
}

现在的问题是method3method1 中的数据未提交,即使在将传播设置为REQUIRES_NEW 之后也是如此。或者我们可以只在 DAO 层进行这种传播吗?

【问题讨论】:

  • 来自 javadocs:Actual transaction suspension will not work out-of-the-box on all transaction managers. This in particular applies to {@link org.springframework.transaction.jta.JtaTransactionManager}, which requires the {@code javax.transaction.TransactionManager} to be made available it to it (which is server-specific in standard Java EE). @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager 你使用什么应用服务器、数据库和事务管理器?
  • 您当前的冲洗模式是什么?在method1中的saveOrUpdate之后添加一个flush flush的调用。
  • 感谢弗拉基米尔的信息。我正在使用休眠,数据库是 Oracle。
  • @rbento,我尝试在 saveOrUpdate 之后使用刷新,但它没有提交更改。数据库为外部事务同步。我猜因为 dao 层中的 saveOrUpdate 又是另一种方法(它实现了 genericDao),并且正如 Vladimir 所说,事务暂停不能开箱即用,这就是为什么即使在方法 1 中也没有提交事务。
  • 为什么要在每个方法之后提交?事务在方法 1 启动时启动(它暂停当前事务),并将在方法 1 结束时提交。由于method2和method3是内部方法调用,标记它们@Transactional是无用的(Spring AOP默认使用代理,内部方法调用不通过代理)。

标签: java spring transactional propagation


【解决方案1】:

正如我在您的代码中看到的,method2(..) 属于同一个对象调用 method1(..) 并且导致 method2() 使用由 method1 创建的相同新事务,这种行为是由代理模式强制执行的春天使用我引用:

在代理模式下(默认),只有外部方法调用 通过代理进来的被拦截。这意味着 自调用,实际上是目标对象调用的方法 目标对象的另一种方法,不会导致实际 即使调用的方法标记为 @事务

要进行两个事务,您必须在另一个对象中创建第二个方法并使用 @Transactional(propagation=Propagation.REQUIRES_NEW) 注释 达到预期效果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2020-10-20
    • 2012-09-05
    • 2023-03-03
    • 1970-01-01
    • 2021-10-31
    • 2015-09-01
    相关资源
    最近更新 更多