java - Spring 事务 REQUIRED 与 REQUIRES_NEW : Rollback Transaction

标签 java spring hibernate transactions spring-transactions

我有一个具有 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 文档说:支持当前事务,如果不存在则创建一个新事务。

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

回滚问题呢?如果新方法调用在使用现有事务时回滚怎么办?这不会回滚整个事务甚至之前的调用吗?

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

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

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

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

最佳答案

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

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

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

回滚时 - 使用 REQUIRES_NEW 将强制启动新事务,因此异常将回滚该事务。如果还有另一个事务也在执行 - 根据异常是否在堆栈中冒泡或被捕获 - 您的选择,取决于操作的细节。 此外,为了更深入地讨论事务策略和回滚,我建议:«Transaction strategies: Understanding transaction pitfalls», Mark Richards .

关于java - Spring 事务 REQUIRED 与 REQUIRES_NEW : Rollback Transaction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13051204/

相关文章:

java - spring如何调用websocket服务器向客户端发送消息

java - 据说通配符可以导入包中的所有类。 "It doesn' t import child packages, fields, or methods."这是什么意思?

java - 如何在Java中实现这个通用方法?

java - 如何跳过当前页并写入下一页?

java - 在 Spring Hibernate 中映射子类

hibernate - 评估子属性时, hibernate 或语句不起作用的地方

java - 带有 com.mysql.jdbc.ReplicationDriver 的 MySql Master/Slave Spring Hibernate

java - 选项卡式导航,将 Intent 附加信息传递给 fragment

java - Spring AOP错误: java. lang.NoClassDefFoundError:org/springframework/cglib/core/SpringNamingPolicy

java - 如何仅在用户定义的类中定义自定义请求范围