当前位置:网站首页>事务的隔离级别详解
事务的隔离级别详解
2022-06-27 15:34:00 【华为云】
四个隔离级别
SQL 标准定义了四个隔离级别:
- READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致修改丢失、脏读、幻读或不可重复读。可以通过"排他写锁"解决丢失修改问题。
- READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读和丢失修改,但是幻读或不可重复读仍有可能发生。
- REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- SERIALIZABLE(可串行化): 最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ-UNCOMMITTED | √ | √ | √ |
| READ-COMMITTED | × | √ | √ |
| REPEATABLE-READ | × | × | √ |
| SERIALIZABLE | × | × | × |
不同的隔离级别导致的问题
多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。
- 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
- 丢失修改(Lost to modify): 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务 1 读取某表中的数据 A=20,事务 2 也读取 A=20,事务 1 修改 A=A-1,事务 2 也修改 A=A-1,最终结果 A=19,事务 1 的修改被丢失。
- 不可重复读(Unrepeatableread): 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。
- 幻读(Phantom read): 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。
不可重复读和幻读区别:
不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。
MySQL 的默认隔离级别是什么?
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看,MySQL 8.0 该命令改为SELECT @@transaction_isolation;
mysql> SELECT @@tx_isolation;+-----------------+| @@tx_isolation |+-----------------+| REPEATABLE-READ |+-----------------+MySQL InnoDB 的 REPEATABLE-READ(可重读)并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁度使用到的机制就是 Next-Key Locks。
因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED(读取提交内容) ,但是你要知道的是 InnoDB 存储引擎默认使用 REPEATABLE-READ(可重读) 并不会有任何性能损失。
InnoDB 存储引擎在 分布式事务 的情况下一般会用到 SERIALIZABLE(可串行化) 隔离级别。
拓展一下(以下内容摘自《MySQL 技术内幕:InnoDB 存储引擎(第 2 版)》7.7 章):
InnoDB 存储引擎提供了对 XA 事务的支持,并通过 XA 事务来支持分布式事务的实现。分布式事务指的是允许多个独立的事务资源(transactional resources)参与到一个全局的事务中。事务资源通常是关系型数据库系统,但也可以是其他类型的资源。全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的 ACID 要求又有了提高。另外,在使用分布式事务时,InnoDB 存储引擎的事务隔离级别必须设置为 SERIALIZABLE。
本文内容到此结束了,
如有收获欢迎点赞收藏关注️,您的鼓励是我最大的动力。
如有错误疑问欢迎各位大佬指出。
保持热爱,奔赴下一场山海。
边栏推荐
- 开源二三事|ShardingSphere 与 Database Mesh 之间不得不说的那些事
- 洛谷_P1003 [NOIP2011 提高组] 铺地毯_暴力枚举
- NFT dual currency pledge liquidity mining DAPP contract customization
- Sigkdd22 | graph generalization framework of graph neural network under the paradigm of "pre training, prompting and fine tuning"
- ICML 2022 ぷ the latest fedformer of the Dharma Institute of Afghanistan ⻓ surpasses SOTA in the whole process of time series prediction
- LeetCode每日一练(主要元素)
- Condom giants' sales have fallen by 40% in the past two years. What are the reasons for the decline?
- The role of the symbol @ in MySQL
- NFT双币质押流动性挖矿dapp合约定制
- Principle Comparison and analysis of mechanical hard disk and SSD solid state disk
猜你喜欢

Centos8 PostgreSQL initialization error: initdb: error: invalid locale settings; check LANG and LC_* environment

开源二三事|ShardingSphere 与 Database Mesh 之间不得不说的那些事
![[kotlin] the next day](/img/13/9040e72de1243e827045b4572b0cd9.png)
[kotlin] the next day

Bit.Store:熊市漫漫,稳定Staking产品或成主旋律
![洛谷_P1008 [NOIP1998 普及组] 三连击_枚举](/img/9f/64b0b83211bd1c615f2db9273bb905.png)
洛谷_P1008 [NOIP1998 普及组] 三连击_枚举

Open source 23 things shardingsphere and database mesh have to say

PSS: you are only two convolution layers away from the NMS free+ point | 2021 paper

ICML 2022 | 阿⾥达摩院最新FEDformer,⻓程时序预测全⾯超越SOTA

Problems encountered in vs compilation

SQL parsing practice of Pisa proxy
随机推荐
[issue 18] share a Netease go classic
洛谷_P1003 [NOIP2011 提高组] 铺地毯_暴力枚举
If you want to use DMS to handle database permissions, can you only use Alibaba cloud ram accounts (Alibaba cloud RDS)
Problems encountered in vs compilation
守护雪山之王:这些AI研究者找到了技术的新「用武之地」
The role of the symbol @ in MySQL
【kotlin】第二天
面试半年,上个月成功拿到阿里P7offer,全靠我啃烂了这份2020最新面试题!
[MySQL] query valid data based on time
Basic configuration and usage of Jupiter notebook
Eolink 推出面向中小企业及初创企业支持计划,为企业赋能!
创建数据库并使用
Introduction to TTCAN brick moving
The array of C language is a parameter to pass a pointer
MySQL中符号@的作用
Go error collection | when a function uses a return value with a parameter name
可变参数模板 Variadic Templates
What should the ultimate LAN transmission experience be like
SQL injection principle
基于 Nebula Graph 构建百亿关系知识图谱实践