java – Spring事务中REQUIRES_NEW和NESTED传播行为的差异

前言

首先:

它不是Differences between requires_new and nested propagation in Spring transactions的重复 – 我读了它,但我没有找到我的问题的答案

题:

在阅读了我提到的主题之后,我理解了物理交易数量中传播水平的主要区别:
2 db事务 – 对于外部和内部方法的REQUIRES_NEW
1 db transaction – 用于NESTED for outer和for inner方法.如果底层数据库不支持保存点,它将无法工作

但是看起来逻辑从我的观点来看是相同的.

如何理解在实践中使用哪个级别?任何用例了解它?方便的行为差异的例子?

附:
我想其他事务差异有一些可见性,因为不同的事务提交时间.

P.S.2

另外我认为有性能差异:

@Transactional
public void outer(){
    for(int i=0;i<100500;i++){
        inner();
    }   
}

@Transactional
public void inner(){
   //some logic
}

对于那种情况,NESTED会更好,因为1长的物理交易而不是100500 1

最佳答案
我看到的巨大差异:

在嵌套的情况下:

>如果外部事务回滚,则嵌套的tra也会回滚.
>可见性:如果db执行的MVCC很常见,

>嵌套的tra看到外部tra的先前更改.
>在提交外部后,将看到嵌套tra的更改已提交并对其他tra可见.

> performance:请注意,外部事务的工作集由内部事务扩展.因此更多的锁,MVCC的更多preimage-storage,更长的redo-log-entry.

在requires_new的情况下:

>如果回滚外部事务,则在外部tra的回滚情况下,不会回滚内部tra的更改.
>可见性:在MVCC的情况下,这是非常常见的,

>内部tra不会看到尚未提交的外部tra所做的更改.
>在提交此内部tra后,即使在提交外部tra之前,嵌套tra的更改也将立即呈现为对其他tras提交并可见.较少的锁,但由于许多提交更多的外部操作,重做锁中的记录更多.

性能方面,如果其他因素不重要,您可以在交易规模和交易数量之间找到收支平衡点. i.m.O这个问题没有一般的答案,如果嵌套比requires_new快.

相关文章

Spring Cloud为Spring Boot应用程序提供Netflix OSS集成。 提供的功能模块包括服务发现(Eureka),断路...
Spring Cloud 学习笔记;maven配置;入门学习;基于Spring Boot 实现;服务端配置,客户端配置;
可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的...
Spring中各种方式进行日期时间处理,有作用于单个实体的,也有作用于全局的,有作用于请求入参的,有作...
跨域资源共享(Cross-origin resource sharing)(CORS)是W3C的标准,大部分的浏览器都实现了这个标准...
Spring Boot使创建基于Spring的应用程序变得轻松,大部分的SpringBoot应用程序都只需要很少的Spring配置...