将Spring事务REQUIRES_NEW传播到方法中的方法吗?

时间:2016-07-14 06:10:50

标签: java spring transactional propagation

我的要求是从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);
}

现在问题是,即使将传播设置为method3,也未在method1REQUIRES_NEW中提交数据。或者我们只能在DAO层进行传播?

1 个答案:

答案 0 :(得分:0)

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

  

在代理模式(默认设置)下,只有外部方法调用   通过代理进入是截获的。这意味着   自调用,实际上是目标对象调用中的一个方法   目标对象的另一种方法,不会导致实际的   即使调用的方法被标记,运行时的事务也是如此   @Transactional

要进行两个事务,您必须在另一个对象中创建第二个方法并使用{{1}}进行注释 达到预期的效果