MySQL 中的事务隔离级别有哪些?MySQL 默认的事务隔离级别是什么?为什么选择这个级别?数据库的脏读、不可重复读和幻读分别是什么?

news/2025/2/27 2:30:34

MySQL 中的事务隔离级别有哪些?

1. 读未提交(Read Uncommitted)

  • 特点:一个事务可以读取另一个事务未提交的数据。如果一个事务对数据进行了修改但尚未提交,其他事务仍能读取到这些未提交的修改。
  • 优缺点
    • 优点:能够最大程度地实现并发性,减少锁定数据的时间。
    • 缺点:容易导致「脏读」问题,即读取到未提交的错误数据。
  • 适用场景:一般不常用,适用于对数据一致性要求不高且需要高并发的场景。

2. 读已提交(Read Committed)

  • 特点:一个事务只能读取另一个事务已经提交的数据。每次读取时,都会获取最新的数据版本。
  • 优缺点
    • 优点:避免了脏读问题,能读取到已提交的最新数据。
    • 缺点:可能会出现不可重复读问题,即多次读取同一数据时结果不一致。
  • 适用场景:适用于需要避免脏读但能接受不可重复读的场景。

3. 可重复读(Repeatable Read,InnoDB 默认级别)

  • 特点:在一个事务中多次读取同一数据时,结果一致。这通过多版本并发控制(MVCC)实现,确保事务开始后看到的数据是事务开始时的快照。
  • 优缺点
    • 优点:避免了脏读和不可重复读问题。
    • 缺点:可能会出现幻读问题,即插入或删除操作导致事务内查询结果不一致。
  • 适用场景
    • 是 MySQL InnoDB 的默认隔离级别,适用于大多数需要保证数据一致性的场景。
    • 通过锁定机制(如间隙锁、临键锁)可以一定程度上避免幻读。

4. 串行化(Serializable)

  • 特点:强制事务串行执行,确保事务执行时其他事务无法插入或更新数据。它通过在读取数据时加共享锁实现。
  • 优缺点
    • 优点:避免了脏读、不可重复读和幻读问题,事务隔离性最强。
    • 缺点:降低了并发性能,可能导致死锁或事务等待。
  • 适用场景:适用于对数据一致性要求极高且能接受低并发的场景。

各隔离级别支持的功能对比

以下是不同隔离级别在功能支持上的对比表格:

功能/隔离级别读取未提交数据(脏读)不可重复读幻读是否加共享锁(共享锁允许多个事务读取同一数据)
Read Uncommitted否(可能使用快照隔离)
Read Committed是(按需加锁)
Repeatable Read否(通常使用 MVCC,InnoDB 不加共享锁,而用快照)
Serializable是(加共享锁)

如何设置隔离级别

可以通过以下语句设置事务的隔离级别:

  • 临时设置(当前会话)

    SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    

    支持的级别包括:READ UNCOMMITTEDREAD COMMITTEDREPEATABLE READSERIALIZABLE

  • 全局设置

    SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
    

通过选择合适的隔离级别,可以在数据一致性和并发性能之间找到平衡,以满足具体的业务需求。

MySQL 默认的事务隔离级别是什么?为什么选择这个级别?

为什么选择可重复读作为默认隔离级别

1.平衡一致性和并发性能

  • 可重复读 在一致性和并发性能之间提供了合理的折中。它避免了脏读和不可重复读问题,同时通过多版本并发控制(MVCC)机制,允许多个事务并发执行,而不会互相阻塞。

2.避免常见并发问题

  • 脏读:一个事务读取了另一个事务未提交的数据,如果该事务回滚,会导致数据不一致。
  • 不可重复读:一个事务在多次读取同一数据时,结果不一致,因为其他事务修改了数据。
  • 可重复读 隔离级别通过 MVCC 机制,确保在一个事务中多次读取同一数据时结果一致,从而避免了这些问题。

3.适用于大多数应用场景

  • 可重复读 是一个较为严格的隔离级别,适用于大多数需要保证数据一致性的场景,如金融交易、库存管理等。它在保证数据一致性的同时,仍然能提供较高的并发性能。

4.实现机制

  • MVCC(多版本并发控制):在可重复读隔离级别下,MySQL 使用 MVCC 机制,允许多个版本的数据同时存在。每个事务看到的数据版本是事务开始时的快照,从而避免了数据不一致的问题。
  • ReadView:在事务开始时创建一个 ReadView,事务中的查询都基于这个 ReadView,确保多次查询结果一致。

总结

MySQL 默认的事务隔离级别是 可重复读,因为它在数据一致性和并发性能之间提供了合理的折中,避免了脏读和不可重复读问题,适用于大多数需要保证数据一致性的场景。通过 MVCC 和 ReadView 机制,可重复读隔离级别实现了高效的数据一致性和并发性能。

数据库的脏读、不可重复读和幻读分别是什么?

1. 脏读(Dirty Read)
  • 定义:一个事务读取了另一个事务尚未提交的数据。如果这个未提交的事务后来被回滚,那么第一个事务读取到的数据就是无效的(脏数据)。
  • 原因:事务隔离级别设置较低,如 未提交读(Read Uncommitted),导致读取到了未提交的数据。
  • 示例:假设两个事务 T1 和 T2:
    • T1 开始,并更新表中某条记录,但尚未提交。
    • T2 开始,读取了 T1 更新后的数据。
    • T1 回滚,T2 读取到的数据就变成了无效的。
2. 不可重复读(Non-Repeatable Read)
  • 定义:一个事务在两次读取同一数据时,因其他事务的修改,导致两次读取的结果不一致。包括数据被更新和删除两种情况。
  • 原因:事务隔离级别设置为 提交读(Read Committed)未提交读,其他事务在当前事务两次读取之间提交了对数据的修改或删除操作。
  • 示例:假设两个事务 T1 和 T2:
    • T1 开始,第一次读取某条记录。
    • T2 开始,修改该记录并提交。
    • T1 第二次读取时,发现数据已发生变化。
3. 幻读(Phantom Read)
  • 定义:一个事务在两次查询同一个范围的数据时,因其他事务插入或删除记录,导致前后两次查询的记录集合不一致。例如,第一次查询得到 10 条记录,第二次查询得到 11 条记录,多出的那一条记录被称为幻影行。
  • 原因:其他事务在当前事务两次查询之间插入或删除了符合条件的记录。
  • 示例:假设两个事务 T1 和 T2:
    • T1 开始,查询某个范围的记录,得到 10 条。
    • T2 开始,在该范围内插入一条新记录并提交。
    • T1 再次查询时,发现结果变为 11 条。

总结

  • 脏读 是读取到未提交的数据。
  • 不可重复读 是读取到已提交的更新或删除数据,导致两次读取结果不同。
  • 幻读 是读取到已提交的插入或删除数据,导致记录集合前后不一致。

http://www.niftyadmin.cn/n/5869390.html

相关文章

百度AI:起个大早,赶个晚集?

作为中国最早布局人工智能的互联网巨头,百度曾以“All in AI”的雄心引领行业,却在近年被字节跳动、DeepSeek、阿里巴巴等后来者超越,甚至被调侃“起了大早,赶了晚集”。这一现象背后,既有战略选择的偏差,也…

结构型模式 - 装饰者模式 (Decorator Pattern)

结构型模式 - 装饰者模式 (Decorator Pattern) 在展开讲装饰者模式之前,不得不提一下代理模式,因为这两者在一定的层度上是有相似性的, 通过对比可以让我们更好的理解装饰者. 定义与核心目的 装饰者模式 定义:动态地将责任附加到对象上。若要扩展功能&#xff0c…

江协科技/江科大-51单片机入门教程——P[1-1] 课程简介P[1-2] 开发工具介绍及软件安装

本教程也力求在玩好单片机的同时了解一些计算机的基本概念,了解电脑的一些基本操作,了解电路及其元器件的基本理论,为我们学习更高级的单片机,入门IT和信息技术行业,打下一定的基础。 目录 1.课程简介 2.开发工具及…

SQL: DDL,DML,DCL,DTL,TCL,

Structured Query Language,结构化查询语言, 是一种用于管理和操作关系数据库的标准编程语言。 sql的分类 DQL(Data Query Language):数据查询语言 DDL(Data Definition Language):数据定义语…

构成正方形的数量

构成正方形的数量 真题目录: 点击去查看 E 卷 100分题型 题目描述 输入N个互不相同的二维整数坐标&#xff0c;求这N个坐标可以构成的正方形数量。[内积为零的的两个向量垂直] 输入描述 第一行输入为N&#xff0c;N代表坐标数量&#xff0c;N为正整数。N < 100 之后的 …

前端页面什么是全屏嵌入/什么是局部嵌入

1. 什么是 <div> 容器标签&#xff1f; 通俗来说&#xff0c;<div> 标签就像一个“盒子”&#xff0c;你可以把任何东西放进去&#xff0c;比如文字、图片、按钮等。它是一个非常灵活的标签&#xff0c;用来组织和分隔网页内容。 举个例子&#xff1a; 想象你有…

Redis面试题----MySQL 里有 2000w 数据,Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?

要保证 Redis 中存储的 20w 数据都是热点数据&#xff0c;可以从数据筛选和数据淘汰两个大的方面来考虑&#xff0c;以下是详细的实现思路和方法&#xff1a; 数据筛选 1. 基于业务规则 分析业务场景&#xff1a;不同的业务场景有不同的热点数据特征。例如&#xff0c;在电商…

数字IC低功耗后端设计实现之power gating和isolation技术

考虑低功耗设计需求&#xff0c;下图中间那个功能模块是需要做power domain的&#xff0c;即这个模块需要插MTCMOS。需要开启时&#xff0c;外面的VDD会和这个模块的LOCAL VDD形成通路&#xff0c;否则就是断开即power off状态。 这些低功耗设计实现经验&#xff0c;你真的懂了…