事务的隔离级别——解决脏读、不可重复度、幻读

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 事务的隔离级别——解决脏读、不可重复度、幻读

事务隔离级别


先看一下如何查看事务隔离级别。

# 查看默认事务隔离级别(session)
select @@transaction_isolation;
# 查看当前会话的隔离级别
select @@session.transaction_isolation;
# 查看全局的事务隔离级别
select @@global.transaction_isolation;
复制代码

Mysql 下事务的隔离级别有四种,由低到高依次为 Read uncommittedRead committedRepeatable read (默认)、Serializable ,这四个级别中的后三个级别可以逐个解决脏读不可重复读幻读的问题。


1. 脏读

对于两个事务T1与T2,T1读取了已经被T2更新但是还没有提交的字段之后,若此时T2回滚,T1读取的内容就是临时并且无效的。


示例:

打开两个Mysql客户端,分别执行下面操作,查询当前会话的隔离级别(默认 REPEATABLE READ )。修改当前会话隔离级别为( READ UNCOMMITTED )。全局事务隔离级别仍然为 REPEATABLE READ

mysql> SELECT @@session.transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;    # 修改会话隔离级别
mysql> SELECT @@session.transaction_isolation;    # 当前会话隔离级别已修改
+---------------------------------+
| @@session.transaction_isolation |
+---------------------------------+
| READ-UNCOMMITTED                |
+---------------------------------+
mysql> SELECT @@global.transaction_isolation;    # 全局事务隔离级别未修改
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| REPEATABLE-READ                |
+--------------------------------+
复制代码

之后黑框用来做更新,白框用来查询。

image.png

由于黑框的 ④ 回滚,白色背景的客户端中 ③ 读取的数据就是临时并且无效的。即脏读。


2. 不可重复读

对于两个事务T1和T2,T1读取了一个字段,然后T2更新了该字段并提交之后,当T1再次读取的时候,结果不一致的情况发生。

image.png

由于黑框的更新操作,白框出现两次读取的结果不一致。


3. 幻读

 对于两个事务T1、T2,T1从表中读取数据,然后T2进行了INSERT操作并提交,当T1再次读取的时候,结果不一致的情况发生。

image.png

由于黑框的插入操作,白框出现两次读取的结果不一致。


几种现象在各隔离级别中出现的可能性

隔离级别 脏读(Dirty Read) 不可重复读(NonRepeatable Read) 幻读(Phantom Read)
未提交读(Read uncommitted) 可能 可能 可能
已提交读(Read committed) 不可能 可能 可能
可重复读(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
SQL 关系型数据库 MySQL
事务及事务的隔离级别
事务及事务的隔离级别
|
5月前
|
SQL 关系型数据库 MySQL
对数据库事务理解以及脏读、不可重复读以及幻读问题
对数据库事务理解以及脏读、不可重复读以及幻读问题
|
5月前
|
SQL
事务的隔离级别
事务的隔离级别 多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据,则会引发一些问题。设置不同隔离级别就可以解决 1.脏读:一个事务,读取到另一个事务中没有提交的数据 2.不可重复读,在同一个事务中,两次读取的数据不一样 3.幻读:(dml)一个事务操作数据表中记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改 隔离级别 1.read uncommitted:读未提交 产生问题:脏读、不可重复读、幻读 2.read committed:读已提交 产生问题:不可重复读、幻读 3.repeatable read:可重复读 产生问题:幻读 4.serializable:串行
41 0
|
12月前
|
关系型数据库 MySQL 数据库
事务的基本特性和隔离级别
事务的基本特性和隔离级别
42 0
|
Oracle 关系型数据库 MySQL
mysql数据库事务脏读、不可重复度、幻读详解
mysql数据库事务脏读、不可重复度、幻读详解
127 0
|
数据库
数据库事务的并发问题 (脏读、幻读、不可重复读)
数据库事务的并发问题 (脏读、幻读、不可重复读)
116 0
|
算法 关系型数据库 MySQL
事务的隔离级别和对应的问题
事务的隔离级别和对应的问题
图解脏读、幻读、不可重复读
图解脏读、幻读、不可重复读
72 0
|
SQL Oracle 关系型数据库
Mysql模拟事物的隔离级别【脏读、不可重复读、幻读】
Mysql模拟事物的隔离级别【脏读、不可重复读、幻读】
186 0
Mysql模拟事物的隔离级别【脏读、不可重复读、幻读】