【发布时间】: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);
}
现在的问题是method3 和method1 中的数据未提交,即使在将传播设置为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