千家信息网

什么是Mysql数据库的四类隔离级别

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,下文给大家带来关于什么是Mysql数据库的四类隔离级别,感兴趣的话就一起来看看这篇文章吧,相信看完什么是Mysql数据库的四类隔离级别对大家多少有点帮助吧。一、简介由MySQL AB公司开发,是最流行
千家信息网最后更新 2026年10月31日什么是Mysql数据库的四类隔离级别

下文给大家带来关于什么是Mysql数据库的四类隔离级别,感兴趣的话就一起来看看这篇文章吧,相信看完什么是Mysql数据库的四类隔离级别对大家多少有点帮助吧。

一、简介

由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点:

  • 1、是一种数据库管理系统

  • 2、是一种关联数据库管理系统

  • 3、是一种开放源码软件,且有大量可用的共享MySQL软件

  • 4、MySQL数据库云服务器具有快速、可靠和易于使用的特点

  • 5、MySQL云服务器工作在客户端/云服务器模式下,或嵌入式系统中

  • InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建。这样,表的大小就能超过单独文件的最大容量。表空间可包括原始磁盘分区,从而使得很大的表成为可能。表空间的最大容量为64TB。

二、SQL标准定义四类隔离级别

2.1. 低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
Read Uncommitted (读未提交)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed (读提交)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
Repeatable Read (可重读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的"幻影" 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

Serializable (可串行)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

2.2. 这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话易发生问题。如:

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

2.3. 在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:

mysql> SHOW GLOBAL VARIABLES LIKE '%iso%'; #查看隔离级别,或select @@tx_isolation

+---------------+-----------------+

| Variable_name | Value |

+---------------+-----------------+

| tx_isolation | REPEATABLE-READ | #mysql默认为可重读

+---------------+-----------------+

1 row in set (0.00 sec)

三、隔离级别测试

测试数据库为test,表为tx;表结构:

idint

num

int

两个命令行客户端分别为A,B;不断改变A的隔离级别,在B端修改数据。

3.1. 将A的隔离级别设置为read uncommitted(读未提交)

mysql> SET tx_isolation='READ-UNCOMMITTED'

在B未更新数据之前:

客户端A:

B更新数据:

客户端B:

客户端A:

经过上面的实验可以得出结论,事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交读是最低的隔离级别。

3.2. 将客户端A的事务隔离级别设置为read committed (读提交)

mysql> SET tx_isolation='READ-COMMITTED'

在B未更新数据之前:

客户端A:

B更新数据:

客户端B:

客户端A:

经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。

3.3. 将客户端A的事务隔离级别设置为repeatable read (可重读)

mysql> SET tx_isolation='REPEATABLE-READ'

在B未更新数据之前:

客户端A:

B更新数据:

客户端B:

客户端A:

B插入数据:

客户端B:

客户端A:

由以上的实验可以得出结论,可重复读隔离级别只允许客户端读取已提交记录,并且必须是自己该客户端的事务提交后才能看到,其他客户端更新的并提交了的数据。这样也是会造成幻读,因为客户端事务提交前后所读取的数据可能不一样,如果其他客户端更新了数据,并提交了事务,那当前这个客户端没做任何操作,只是事务提交前后所读取的内容不一致造成幻读。

3.4. 将客户端A的事务隔离级别设置为Serializable (可串行)

mysql> SET tx_isolation='SERIALIZABLEA'

A端打开事务,B端插入一条记录

事务A端:

事务B端:

因为此时事务A的隔离级别设置为serializable,开始事务后,并没有提交,所以事务B只能等待。

事务A提交事务:

事务A端

事务B端

serializable完全锁定字段,若一个事务来查询同一份数据就必须等待,直到前一个事务完成并解除锁定为止 。是完整的隔离级别,会锁定对应的数据表格,因而会有效率的问题。

看了以上关于什么是Mysql数据库的四类隔离级别详细内容,是否有所收获。如果想要了解更多相关,可以继续关注我们的行业资讯板块。

事务 数据 级别 隔离 客户 客户端 更新 数据库 查询 问题 系统 一致 空间 实例 服务器 管理系统 结论 范围 这是 实验 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技 科技互联网政务服务 金融科技创新监管互联网金融 奇酷互联网科技公司 美国互联网黑科技 互联网科技logo 互联网 科技馆 港股科技和互联网 互联网科技革命什么开始 花神(南京)互联网科技有限公司 移动互联网科技公司 速维有品互联网信息科技(苏州)有限公司 内蒙古九一互联网科技 互联网科技大赛获奖感言 众安科技工业互联网合作 合肥互联网科技公司公章图片 沐思想互联网科技有限公司 世界互联网科技成果奖 银川新华互联网科技学校是国营吗 恒生科技指数 中概互联网 互联网的科技 互联网最新的科技 互联网科技金融公司 互联网养老 桔豆科技 深圳国际航运科技和互联网 阿里巴巴算科技企业还是互联网 深圳市优智互联网科技有限公司 米聚互联网科技南京有限公司排面 每天都有哪些好的互联网科技 互联网科技手机排行榜
0