事务的 4 个隔离级别

事务的 4 个隔离级别一、事务的 4 个隔离级别 未提交读(Read Uncommitted):事务可以读取未提交的数据,也称作脏读(Dirty Read)。一般很少使用。 提交读(Read Committed):是大都…

事务的 4 个隔离级别

一、事务的 4 个隔离级别

  • 未提交读(Read Uncommitted):事务可以读取未提交的数据,也称作脏读(Dirty Read)。一般很少使用。

  • 提交读(Read Committed):是大都是 DBMS (如:Oracle, SQLServer)默认事务隔离。执行两次同意的查询却有不同的结果,也叫不可重复读。

  • 可重复读(Repeable Read):是 MySQL 默认事务隔离级别。能确保同一事务多次读取同一数据的结果是一致的。可以解决脏读的问题,但理论上无法解决幻读(Phantom Read)的问题。

  • 可串行化(Serializable):是最高的隔离级别。强制事务串行执行,会在读取的每一行数据上加锁,这样虽然能避免幻读的问题,但也可能导致大量的超时和锁争用的问题。很少会应用到这种级别,只有在非常需要确保数据的一致性且可以接受没有并发的应用场景下才会考虑。

    solation Level 脏读可能性(Dirty Read) 不可重复读可能性(Non Repeatable Read) 幻读可能性(Phantom Read)
    ead Uncommitted Yes Yes Yes
    ead Committed Yes Yes
    epeatable Read Yes
    erializable

二、测试:模拟异常发生

我们通过两个客户端(A 和 B)测试模拟一下这三种异常(脏读、不可重复读和幻读)。

  • 准备工作

    1、首先我们操作客户端 A 查看当前隔离级别。

    事务的 4 个隔离级别

    2、可以看到当前的隔离级别是 REPEATABLE-READ,也就是可重复读。那么接下来我们要把它切换为未提交读(READ UNCOMMITTED)方便测试。

    事务的 4 个隔离级别

    3、切换完成后,我们还需要设置 autocommit 参数为 0 ,因为 MySQL 是默认自动提交事务的。

    事务的 4 个隔离级别

    4、然后我们操作客户端 B 以刚才客户端 A 同样的操作实现切换隔离级别为 READ UNCOMMITTED 和 autocommit 为 0。

    5、最后准备一个数据表测试数据就完成了准备工作,我这里新建了个students数据表用来测试。

    事务的 4 个隔离级别

  • 脏读

    事务 A 往测试表新增了一条数据,而事务 B 查询测试表时,读到事务 A 新增了却还未提交的数据。如果事务 A 回滚,那么事务 B 读到的数据就是脏数据。

    步骤 事务 A 事务 B 注释
    1 BEGIN; BEGIN; 开启事务。
    2 INSERT INTO students VALUES (5, “赵六”);   事务 A 新增一条数据。
    3   SELECT * FROM students; 事务 B 读到了事务 A 新增却还没提交的数据。
    4 ROLLBACK;   要是这时事务 A 回滚操作。
    5   SELECT * FROM students; 事务 B 再次查询发现已经没有了「赵六」的数据。
    6   COMMIT; 提交事务。
    • 事务 A 回滚前,事务 B 查询到的结果。

      事务的 4 个隔离级别

    • 事务 A 回滚后,事务 B 查到的结果。

      事务的 4 个隔离级别

  • 不可重复读

    同一事务两次查询读取同一数据,得到的结果不一致。

    步骤 事务 A 事务 B 注释
    1 BEGIN; BEGIN; 开启事务。
    2   SELECT name FROM WHERE id = 1; 事务 B 查询 id = 1 的是「张三」。
    3 UPDATE students SET name = “张三三” WHERE id = 1;   事务 A 修改 id = 1 为「张三三」。
    4 COMMIT;   提交事务 A。
    5   SELECT name FROM WHERE id = 1; 事务 B 再次查询 id = 1 的已经改成「张三三」。
        COMMIT; 提交事务 B。
    • 事务 A 修改数据前,事务 B 查到的结果。

      事务的 4 个隔离级别

    • 事务 A 修改数据后,事务 B 查到的结果。

      事务的 4 个隔离级别

  • 幻读

    同一事务两次查询同一范围数据,得到的结果不一致。幻读是不可重复读的一种特殊情景,事务 A 查询某条件范围的数据,而事务 B 正在修改此条件范围的数据。

    步骤 事务 A 事务 B 注释
    1 BEGIN; BEGIN; 开始事务。
    2   SELECT * FROM students WHERE id BETWEEN 1 AND 5; 事务 B 查询某范围内的数据。
    3 INSERT INTO students VALUES (4, “赵六”);   事务 A 新增一条数据。
    4 COMMIT;   提交事务 A
    5   SELECT * FROM students WHERE id BETWEEN 1 AND 5; 事务 B 再次查询发现数据发生更改。
    • 事务 A 添加数据前,事务 B 查到的结果。

      事务的 4 个隔离级别

    • 事务 A 添加数据后,事务 B 查到的结果。

      事务的 4 个隔离级别

三、异常小结

  • 脏读:读取到了其他事务还没提交的数据。

  • 不可重复读:两次查询同一条数据有不同的结果,因为其它事务可能在UPDATE操作。

  • 幻读:事务 B 根据条件查询到了 N 条数据,但这时事务 A INSERTDELETE了 M 条符合事务 B 查询条件的数据。事务 B 再次查询结果就和上一次不一致了,得到了 N+M 条数据。

    不可重复读和幻读的区别

    • 不可重复读:是同一数据内容被修改了,是 UPDATE操作。
    • 幻读:某一个范围内的数据行数变多了或变少了,是 INSERTDELETE 操作。

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

(0)
上一篇 2023-03-26
下一篇 2023-03-26

相关推荐

  • oracle 锁用户

    oracle 锁用户oracle 线上用户老是被锁: 1,查明所有的用户哪些被锁了 SQL> select username,account_status,lock_date from dba_users; USE

    2022-12-18
    150
  • 别再写一摞if-else了!再写开除!两种设计模式带你消灭它!「建议收藏」

    别再写一摞if-else了!再写开除!两种设计模式带你消灭它!「建议收藏」代码洁癖狂们!看到一个类中有几十个if-else是不是很抓狂? 设计模式学了用不上吗?面试的时候问你,你只能回答最简单的单例模式,问你有没有用过反射之类的高级特性,回答也是否吗? 这次就让设计模式(模

    2023-03-11
    141
  • 如何选择数据库服务器,参考这几点让你不再被坑「建议收藏」

    如何选择数据库服务器,参考这几点让你不再被坑「建议收藏」随着互联网业务的越来越成熟,各种中小型企业投入的运营成本也越来越高,运营时间随着日积月累的增加,那些以数据库为主要支撑的系统应用,在发展成一定规模之后,对服务器硬件的设备要求就更加苛刻了,一旦服务器…

    2023-03-25
    150
  • 使用Python绘制散点图

    使用Python绘制散点图散点图是一种以点的位置为坐标,以变量的值为数据的图表形式,用于观察两个变量之间的关系是否存在某种模式、趋势或异常值。在数据科学领域,散点图经常用于探索性数据分析和建模。

    2024-05-01
    61
  • 使用正则表达式提高文本处理效率

    使用正则表达式提高文本处理效率文本处理是我们在开发中非常常见的一个问题,不论是从文本中提取信息、替换特定字符或者格式化文本,都需要我们耗费大量时间和精力。但是,使用正则表达式可以帮助我们快速、准确地完成这些操作,提高我们的文本处理效率。本文从多个方面介绍正则表达式在文本处理中的使用方法和技巧,以期帮助读者更好地利用正则表达式提高自己的文本处理能力。

    2024-02-18
    85
  • 设计 | 基于 Redis 谈一谈缓存设计思想

    设计 | 基于 Redis 谈一谈缓存设计思想王奇 顾问软件工程师 目前从事 PaaS 中间件服务(Redis/MongoDB/ELK 等)开发工作,对 NoSQL 数据库有深入的研究以及丰富的二次开发经验,热衷对 NoSQL 数据库领域内的最新

    2023-04-21
    177
  • 融360蒋宏:自动化特征工程和自动建模在风控场景的应用[亲测有效]

    融360蒋宏:自动化特征工程和自动建模在风控场景的应用[亲测有效]01 背景和问题 目前,模型开发的流程越来越规范化,通常可以分为业务分析、样本准备、特征工程、模型构建、模型评估及监控这几个步骤。其中,特征工程和模型构建在建模的整个流程中依然非常耗时,并且非常依赖于

    2023-05-21
    144
  • Python嵌套if语句:表达更为复杂的条件判断

    Python嵌套if语句:表达更为复杂的条件判断a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2023-12-14
    105

发表回复

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