java – Spring事务REQUIRED对REQUIRES_NEW:回滚事务

我有一个方法,具有propagation = Propagation.REQUIRES_NEW事务属性:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void createUser(final UserBean userBean) {
    //Some logic here that requires modification in DB
}

此方法可以同时多次调用,并且对于每个事务,如果发生错误,它会回滚(独立于其他事务)。

问题是,这可能会迫使Spring创建多个事务,即使另一个可用,并且可能会导致一些性能问题。

Java doc of propagation = Propagation.REQUIRED说:支持当前事务,如果没有存在则创建一个新事务。

这似乎解决了性能问题,不是吗?

回滚问题怎么办?如果在使用现有事务时新方法调用回滚,该怎么办?将不会回滚整个事务甚至以前的调用?

[编辑]
我想我的问题不够清楚:

我们有数百个客户端连接到我们的服务器。

对于每个客户端,我们自然需要发送关于事务的反馈(OK或异常 – >回滚)。

我的问题是:如果我使用REQUIRED,是否意味着只使用一个事务,如果第100个客户端遇到问题,第一个客户端的事务也将回滚?

使用REQUIRES_NEW仅在从事务上下文调用该方法时才相关;当从非事务上下文调用该方法时,它的行为将与REQUIRED完全相同 – 它将创建一个新的事务。

这并不意味着所有客户端只有一个事务 – 每个客户端将从非事务上下文开始,并且一旦请求处理将触发@Transactional,它将创建一个新事务。

所以,考虑到这一点,如果使用REQUIRES_NEW对于该操作的语义是有意义的 – 比我不担心性能 – 这将是教科书过早优化 – 我宁愿强调正确性和数据完整性,一旦性能指标被收集,而不是之前。

回滚时 – 使用REQUIRES_NEW将强制启动新事务,因此异常将回滚该事务。如果还有另一个正在执行的事务 – 将会或不会被回滚取决于异常冒泡在堆栈还是被捕获 – 您的选择,基于操作的细节。
此外,为了更深入地讨论事务策略和回滚,我建议:http://www.ibm.com/developerworks/java/library/j-ts1/index.html

http://stackoverflow.com/questions/13051204/spring-transaction-required-vs-requires-new-rollback-transaction

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – Spring事务REQUIRED对REQUIRES_NEW:回滚事务