Spring 事务 REQUIRED 与 REQUIRES_NEW :回滚事务

Posted

技术标签:

【中文标题】Spring 事务 REQUIRED 与 REQUIRES_NEW :回滚事务【英文标题】:Spring transaction REQUIRED vs REQUIRES_NEW : Rollback Transaction 【发布时间】: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 是一回事 【参考方案1】:

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

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

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

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

【讨论】:

你能看看这个问题***.com/questions/44539861/…吗?我需要 REQUIRES_NEW 吗,在 pesist 完成后返回响应,一段时间后它被回滚。【参考方案2】:

如果您确实需要在单独的事务中执行此操作,则需要使用 REQUIRES_NEW 并承受性能开销。注意死锁。

我宁愿换个方式:

在 Java 端验证数据。 在一个事务中运行所有内容。 如果数据库方面出现任何问题 -> 这是数据库或验证设计的重大错误。回滚所有内容并抛出严重的***错误。 编写好的单元测试。

【讨论】:

我们有数百个客户端连接到我们的服务器。对于每个客户端,我们需要发送关于事务的反馈(OK 或异常 -> 回滚)。我的问题仍然存在:如果我使用REQUIRED,是否意味着只使用了一个事务,如果第100个客户端遇到问题,第一个客户端的事务将回滚? 您的客户端连接到服务器将通过单独的线程,每个线程都有自己的事务。一个线程的异常不会影响其他线程的事务。

以上是关于Spring 事务 REQUIRED 与 REQUIRES_NEW :回滚事务的主要内容,如果未能解决你的问题,请参考以下文章

实战Spring事务传播性与隔离性

Spring 事务类型与隔离级别

spring事务传播性与隔离级别

Spring事务重点

spring事务传播属性与隔离级别

Spring事务:传播行为与隔离级别