欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

[MySQL]事务的隔离级别通俗易懂

时间:2023-07-04
事务的 ACID

Atomic : 原子性(看作一个原子操作)Consistency: 一致性(没有提交就不会保存)Isolation: 隔离性(4种隔离级别,事务之间通常不可见)Durability: 持久化(提交之后保存到数据库持久化, 系统崩溃也不会丢失) 事务隔离级别 1、Read Uncommitted 读未提交

没有提交的内容也会被其他事务读取, 可能导致脏读

2、Read Committed 读提交

提交的内容才会被其他内容读取

B事务第一次读取该行的时候A事务没有提交,

A事务提交修改该行

B第二次读取该行的时候数据不一致了

3、Repeatable Read 可重复读 (MYSQL 默认)

保证一个事务的多次读取该行数据一致

幻读:

B事务第一次读取该行的时候A事务没有提交,

A事务提交在该行下面增加一行

B第二次读取该行和其接近的数据发现数据多了, 感觉出了幻觉

InnoDB 通过 MVCC 多版本并发控制解决了幻读问题

4、Serializable 可串行化

读取每一行都加锁, 性能很低, 一般不用, 除非可以接收没有并发

死锁 什么是死锁

A事务等待B的事务释放才能执行, B事务等待A的事务释放才能执行

A事务

start transaction;update user set user.age = 18 where user.id = 1;update user set user.age = 19 where user.id = 2;commit;

B事务

start transaction;update user set user.age = 20 where user.id = 2;update user set user.age = 21 where user.id = 1;commit;

如果 A, B 同时执行了第一个 update , update 会加锁

A 将 第 1 行锁定

B 将 第 2 行锁定

A 需要获取第2行锁才能执行第二个 update

B 需要获取第1行锁才能执行第二个 update

死锁的解决

数据库自身实现了各种死锁的检查和超时机制, 一般检测到死锁就返回错误

InnoDB 目前处理死锁的方法是, 将支持最少锁的事务回滚

MVCC

InnoDB 的 MVCC 是通过在每一行下面多记录 2 个隐藏列来实现的, 创建版本号和删除版本号

insert 新建行

当前系统的版本号作为创建版本号

delete 删除行

当前系统的版本号作为删除版本号

update 修改行

当前行的创建版本号作为删除版本号当前系统的版本号作为创建版本号

这 2 版本号的设计可以让大多数读操作都不加锁, 就对版本号进行检查就解决幻读问题

refrence

高性能 MYSQL 第三版

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。