【发布时间】:2012-10-14 14:39:08
【问题描述】:
我有一个具有propagation = Propagation.REQUIRES_NEW 事务属性的方法:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createUser(final UserBean userBean) {
//Some logic here that requires modification in DB
}
此方法可以同时调用多次,并且对于每个事务,如果发生错误而不是回滚(独立于其他事务)。
问题是这可能会强制 Spring 创建多个事务,即使另一个事务可用,并且可能会导致一些性能问题。
propagation = Propagation.REQUIRED 的 Java 文档说:Support a current transaction, create a new one if none exists.
这似乎解决了性能问题,不是吗?
回滚问题呢?如果新方法调用在使用现有事务时回滚怎么办?这不会回滚整个事务,即使是以前的调用?
[编辑] 我想我的问题不够清楚:
我们有数百个客户端连接到我们的服务器。
对于每个客户端,我们自然需要发送关于事务的反馈(OK 或异常 -> 回滚)。
我的问题是:如果我使用REQUIRED,是否意味着只使用了一个事务,如果第100个客户端遇到问题,第一个客户端的事务也会回滚?
【问题讨论】:
-
这有点像 REQUIRES_NEW,每次调用该方法时都创建新事务。是的,如果你有 REQUIRED 并且事务被回滚,它将回滚整个事情。
-
@DenisTulskiy 整个事情是之前对该函数的每次调用,还是当前调用堆栈?
-
@jidma:整个事务,请参阅@Eugen 的回答,如果
createUser是您的客户端代码调用的第一个方法,那么 REQUIRES_NEW 和 REQUIRED 是一回事
标签: java spring hibernate transactions spring-transactions