MySQL 之事务隔离级别

server/2024/10/18 1:39:25/

在 MySQL 中,事务隔离级别是用于控制事务之间的隔离程度和并发性能的重要设置。不同的事务隔离级别会对数据库的一致性、并发性和性能产生不同的影响。下面将详细阐述 MySQL 中的四种事务隔离级别:读未提交、读已提交、可重复读和串行化。

一、读未提交(Read Uncommitted)

  1. 定义:在这个隔离级别下,事务可以读取到其他事务未提交的数据。这意味着一个事务可以看到其他事务中尚未提交的修改,即使这些修改可能会在后续被回滚。
  2. 影响
    • 数据一致性问题:由于可以读取未提交的数据,可能会导致脏读(Dirty Read)的情况发生。脏读是指一个事务读取到了另一个事务中尚未提交的数据,如果这个事务回滚,那么读取到的数据就是无效的,这会破坏数据的一致性。
    • 并发性能较高:读未提交是隔离级别中限制最少的,因此它允许最大程度的并发。多个事务可以同时进行读写操作,而不需要等待其他事务提交,这在某些对数据一致性要求不高的场景下可以提高系统的并发性能。

二、读已提交(Read Committed)

  1. 定义:在这个隔离级别下,事务只能读取到其他事务已经提交的数据。这意味着一个事务在读取数据时,只会看到已经成功提交的事务对数据的修改。
  2. 影响
    • 避免脏读:相比读未提交,读已提交可以避免脏读的问题,因为它只读取已经提交的数据,确保了数据的有效性。
    • 可能出现不可重复读和幻读:虽然读已提交避免了脏读,但在这个隔离级别下,仍然可能出现不可重复读(Non-Repeatable Read)和幻读(Phantom Read)的情况。不可重复读是指一个事务在两次读取同一数据时,得到的结果不同,这是因为在两次读取之间,其他事务对该数据进行了修改并提交。幻读是指一个事务在两次查询同一范围的数据时,第二次查询结果中出现了第一次查询中没有的数据行,这通常是由于其他事务在两次查询之间插入了新的数据行导致的。
    • 并发性能适中:读已提交的隔离级别比读未提交更加严格,因此在一定程度上会降低并发性能。但相比于可重复读和串行化,它仍然允许较高的并发度。

三、可重复读(Repeatable Read)

  1. 定义:在这个隔离级别下,事务在启动时会创建一个一致性快照,在事务执行期间,始终基于这个快照进行数据读取。这意味着一个事务在多次读取同一数据时,得到的结果是一致的,即使其他事务对该数据进行了修改并提交。
  2. 影响
    • 避免不可重复读:可重复读通过创建一致性快照的方式,避免了不可重复读的问题。事务在执行期间始终看到的是事务启动时的数据状态,不会受到其他事务提交的影响。
    • 可能出现幻读:虽然可重复读避免了不可重复读,但仍然可能出现幻读的情况。这是因为幻读是针对范围查询的,而可重复读只对单个数据行进行快照,无法完全避免其他事务在查询范围内插入新的数据行。
    • 并发性能较好:可重复读在保证一定数据一致性的前提下,允许较高的并发性能。它通过快照机制减少了锁的竞争,使得多个事务可以同时进行读写操作,而不会相互干扰。
    • InnoDB 默认隔离级别:在 MySQL 中,InnoDB 存储引擎的默认隔离级别是可重复读。这是因为可重复读在大多数应用场景下能够提供较好的数据一致性和并发性能。

四、串行化(Serializable)

  1. 定义:在这个隔离级别下,事务之间是完全串行执行的,一个事务在执行时会锁定它所访问的所有数据行,直到事务提交为止。其他事务必须等待当前事务完成后才能对锁定的数据行进行操作。
  2. 影响
    • 避免所有并发问题:串行化是最高的隔离级别,它可以完全避免脏读、不可重复读和幻读等并发问题,确保了数据的绝对一致性。
    • 并发性能最低:由于事务之间是完全串行执行的,因此并发性能非常低。在高并发环境下,可能会导致大量的事务等待,从而降低系统的吞吐量。
    • 适用于对数据一致性要求极高的场景:串行化通常只适用于对数据一致性要求极高的场景,如银行系统、金融交易等。在这些场景下,任何数据不一致都可能导致严重的后果,因此需要牺牲并发性能来保证数据的绝对一致性。

总之,不同的事务隔离级别在数据一致性和并发性能之间进行了不同的权衡。在选择事务隔离级别时,需要根据具体的应用场景来考虑。如果对数据一致性要求不高,可以选择读未提交或读已提交,以提高并发性能;如果需要保证一定的数据一致性,可以选择可重复读;如果对数据一致性要求极高,可以选择串行化,但要注意其对并发性能的影响。同时,还可以通过合理的数据库设计、索引优化和事务管理来进一步提高系统的性能和数据一致性。


http://www.ppmy.cn/server/131392.html

相关文章

Video-LLaMA部署

Video-LLaMA: An Instruction-tuned Audio-Visual Language Model for Video Understanding

axios 的 get 请求传参数

在使用 Axios 发起 GET 请求时,参数通常是通过 URL 的查询字符串来传递的。Axios 提供了一个简洁的接口来构建这样的请求,并自动将参数附加到 URL 上。 以下是一个使用 Axios 发起 GET 请求并传递参数的示例: const axios require(axios);…

机器学习篇-day04-逻辑回归-分类评估-混淆矩阵-精确率-召回率-F1值

主要适用于二分法, 也可以使用多个逻辑回归实现多分类 逻辑回归 线性回归结果 -> Sigmoid函数 > 概率 概率范围: [0, 1] > 设置阈值(假设: 大于0.5 > A) 一. 逻辑回归简介 应用场景 数学知识 sigmoid函数 概率 极大似然估计 核心思想 设模型中含有待估参数w&am…

图论day56|广度优先搜索理论基础 、bfs与dfs的对比(思维导图)、 99.岛屿数量(卡码网)、100.岛屿的最大面积(卡码网)

图论day56|广度优先搜索理论基础 、bfs与dfs的对比(思维导图)、 99.岛屿数量(卡码网)、100.岛屿的最大面积(卡码网)) 广度优先搜索理论基础bfs与dfs的对比(思维导图)&…

深度学习:生成对抗网络(Generative Adversarial Network, GAN)

生成对抗网络(Generative Adversarial Network, GAN) 生成对抗网络(GAN)是一种深度学习模型,最初由Ian Goodfellow于2014年提出。这种模型框架通过让两个神经网络——生成器(Generator)和判别器…

C语言有关结构体的知识(后有通讯录的实现)

一、结构体的声明 1.1 结构体的定义 结构体是一些值的集合,这些值被称为成员变量。结构的每个成员可以是不同的类型 1.2 结构体的声明 这里以描述一个学生为例: struct stu {char name[10];//名字int age;//年龄char id[20];//学号char sex[5];//性别 }…

VSCode 使用 EmmyLua 对lua进行调试

时间:2024年10月 其他:win10,EmmyLua v0.8.20 参考:https://blog.csdn.net/ShenHaoDeHao/article/details/140268354 有几个概念搞清楚就好理解了。一般开发中,我们编写的lua文件由宿主程序的来解析、执行&#xff1…

GAMES104:16 游戏引擎的玩法系统:基础AI-学习笔记

文章目录 一,寻路/导航系统Navigation1.1 Walkable Area1.1.1 Waypoint Network1.1.2 Grid1.1.3 Navigation Mesh1.1.4 Sparse Voxel Octree 1.2 Path Finding1.2.1 Dijkstra Algorithm迪杰斯特拉算法1.2.2 A Star(A*算法) 1.3 Path Smoothin…