我的要求是从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
,也未在method1
和REQUIRES_NEW
中提交数据。或者我们只能在DAO层进行传播?
答案 0 :(得分:0)
正如我在你的代码中看到的,method2(..)属于同一个对象调用method1(..)并导致method2()使用由method1创建的同一个新事务,这种行为是由代理模式强制的春天使用我引用:
在代理模式(默认设置)下,只有外部方法调用 通过代理进入是截获的。这意味着 自调用,实际上是目标对象调用中的一个方法 目标对象的另一种方法,不会导致实际的 即使调用的方法被标记,运行时的事务也是如此 @Transactional
要进行两个事务,您必须在另一个对象中创建第二个方法并使用{{1}}进行注释 达到预期的效果