Spring事务隔离级别详解

Spring事务隔离级别详解当两个事务对同一个数据库的记录进行操作时 那么 他们之间的影响是怎么样的呢 这就出现了事务隔离级别的概念 数据库的隔离性与并发控制有很大关系 数据库的隔离级别是数据库的事务特性 ACID 的一部分 ACID 即原子性 atomicity 一致性 consistency 隔离性 isolation 和持久性 durability Spring 的事务隔离级别有四个 READ UNCOMMITTED READ COMMITTED REPEATABLE READ 和 SERIALIZABLE 还有一个 是数据库默

当两个事务对同一个数据库的记录进行操作时,那么,他们之间的影响是怎么样的呢?这就出现了事务隔离级别的概念。数据库的隔离性与并发控制有很大关系。数据库的隔离级别是数据库的事务特性ACID的一部分,ACID,即原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。

Spring的事务隔离级别有四个:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE,还有一个,是数据库默认的隔离级别DEFAULT,MySQL默认是REPEATABLE_READ。 

下面来具体看看:

整理了一份Java核心知识点。覆盖了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。基本上涵盖了Java架构所有的技术知识点的资料,还覆盖了大厂面试题,同时也有一些springboot等项目源码分享给大家

Spring事务隔离级别详解

Spring事务隔离级别详解

由于资料图片太多就不一一的展示出来了 如果需要获取到这个文档的话扫一扫下方

Spring事务隔离级别详解

1.READ_UNCOMMITTED

READ_UNCOMMITTED:一个事务可以读取到另一个事务未提交的事务记录。

换句话说,a transaction can read the data that is still uncommitted by other transactions。这是Spring事务最弱的隔离级别。见下面的图,事务A开启,写入一条记录,这时候,事务B读入数据,读到了这条记录,但是,之后事务A回滚。因此,事务B读到的数据不是有效的(the database is in an invalid state)。这种情况称为脏读(dirty read)。除了脏读的问题,READ_UNCOMMITTED还可能出现non-repeatable read(不可重复读)和phantom read(幻读)的问题。

Spring事务隔离级别详解

2.READ_COMMITTED

READ_COMMITTED:一个事务只能读取到已经提交的记录,不能读取到未提交的记录。

换句话说,a transaction can only read the committed data, and it can’t read the uncommitted data.因此,dirty read的情况不再发生,但可能会出现其他问题。见下图。

Spring事务隔离级别详解

在事务A两次读取的过程之间,事务B修改了那条记录并进行提交。因此,事务A前后两次读取的记录不一致。这个问题称为non-repeatable read(不可重复读)。(两次读取的记录不一致,重复读取就会发现问题。)

除了non-repeatable read的问题,READ_COMMITTED还可能发生phantom read的问题。

3.REPEATABLE_READ

REPEATABLE_READ意思是,一个事务可以多次从数据库读取某条记录,而且多次读取的那条记录都是一致的,相同的。这个隔离级别可以避免dirty read和non-repeatable read的问题,但可能发生phantom read的问题。如下图。

Spring事务隔离级别详解

事务A两次从数据库读取一系列记录,期间,事务B插入了某条记录并提交。事务A第二次读取时,会读取到事务B刚刚插入的那条记录。在事务期间,事务A两次读取的一系列记录不一致,这个问题称为phantom read。

4.SERIALIZABLE

SERIALIZABLE是Spring最强的隔离级别。事务执行时,会在所有级别上加锁,比如read和write时都会加锁,仿佛事务是以串行的方式进行的,而不是一起发生的。这会防止dirty read、non-repeatable read和phantom read的出现,但是,会带来性能的下降。

5.DEFAULT

MySQL默认是REPEATABLE_READ。

这里解释下上面提到的几种异常:

1. 脏读:读到了其他事务还没有提交的数据。

2. 不可重复读:对某数据进行读取,发现两次读取的结果不同,也就是说没有读到相同的内容。这是因为有其他事务对这个数据同时进行了修改或删除。

3. 幻读:事务 A 根据条件查询得到了 N 条数据,但此时事务 B 更改或者增加了 M 条符合事务 A 查询条件的数据,这样当事务 A 再次进行查询的时候发现会有 N+M 条数据,产生了幻读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177404.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午7:35
下一篇 2026年3月26日 下午7:36


相关推荐

  • 快速双边滤波源码「建议收藏」

    %FastBilateralFilterUsingRaisedCosines%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%inImg:grayscaleimage%sigma1:widthofspatialGaussian%sigma2:widthofrangeGaussian%[-w,w]^…

    2022年4月16日
    64
  • 可拔插视图

    可拔插视图基于类的试图fromflask.viewsimportViewfromflaskimportrender_templateclassUserLogin(View):methods=[‘POST’,’GET’]defdispatch_request(self):returnrender_template(‘login.html’)基于方法的试图from

    2022年5月30日
    90
  • LargeInteger

    LargeInteger import java.math.BigInteger;/**   * 超大整数加减乘除:   * 题目要求:如果系统要使用超大整数(超过long的范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数的加法运算   * @author Jason Huang   *   */ public class LargeIntege

    2022年7月25日
    15
  • MATLAB插值函数interp1

    MATLAB插值函数interp1插值法    插值法又称“内插法”,是利用函数f(x)在某区间中已知的若干点的函数值,作出适当的特定函数,在区间的其他点上用这特定函数的值作为函数f(x)的近似值,这种方法称为插值法。如果这特定函数是多项式,就称它为插值多项式。线性插值法    线性插值法是指使用连接两个已知量的直线来确定在这两个已知量之间的一个未知量的值的方法。    

    2022年6月13日
    35
  • sanitizer工具集

    sanitizer工具集sanitizer工具集的介绍Sanitizers是谷歌发起的开源工具集,包括了AddressSanitizer,undefinedbehaviorSanitizer,ThreadSanitizer,LeakSanitizer。GCC从4.8版本开始支持Addresssanitizer和ThreadSanitizer,4.9版本开始支持LeakSanitizer和undefinedbehaviorSanitizer。AddressSanitizer(ASAN):  也即地址

    2025年7月9日
    7
  • 即梦Lora模型使用教程与加载方法

    即梦Lora模型使用教程与加载方法

    2026年3月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号