![](/img/trans.png)
[英]Spring transaction REQUIRED vs REQUIRES_NEW : Rollback Transaction
[英]Will Spring transaction REQUIRES_NEW be propagated to the methods within the method?
我的要求是从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);
}
现在的问题是,即使将传播设置为REQUIRES_NEW
,数据也不会在method3
和method1
提交。 还是只能在DAO层中进行这种传播?
正如我在您的代码中看到的那样,method2(..)属于调用method1(..)的同一对象,并且导致method2()使用由method1创建的相同新事务,此行为是由代理模式spring use i强制执行的引用:
在代理模式(默认设置)下,仅拦截通过代理传入的外部方法调用。 这意味着自调用实际上是目标对象中的一种方法,它调用目标对象的另一种方法,即使调用的方法标记有@Transactional,也不会在运行时导致实际事务。
要进行两次交易,必须在另一个对象中创建第二个方法,并用@Transactional(propagation=Propagation.REQUIRES_NEW)
进行注释才能达到预期的效果
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.