栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

事务的 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 第三版

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/732492.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号