当前位置:网站首页>MYSQL数据库事务的隔离级别(详解)
MYSQL数据库事务的隔离级别(详解)
2022-07-26 22:40:00 【PeakXYH】
一、概述
数据库事务的隔离级别分为四种:(后面为解决的问题,结合下文案例深入理解)
1.读未提交(Read Uncommited)事务1修改的数据被事务2给回滚了
2.读已提交(Read Commited)事务1读到其他事务修改但是没有提交的信息
3.可重复度(Repeatable Read)在事务1进行多次的查询操作的时候,查询的结果不一致的
4.可串行化(Serializable)在同一事务中查询的时候发现多了很多条记录
二、隔离级别出现的原因
为了解决事务在并发执行的时候不会相互影响,所以就引入了事务的隔离级别(也就是在多个事务同时对一个数据进行读取、更新等操作的时候,如何保证数据的正确性和一致性)
三、四种事务隔离级别各自解决的问题
| 脏写 | 脏读 | 不可重复读 | 幻读 | |
| 读未提交 | √ | × | × | × |
| 读已提交 | √ | √ | × | × |
| 可重复度 | √ | √ | √ | × |
| 可串行化 | √ | √ | √ | √ |
四、不同的隔离级别解决的问题
- 脏写(事务1修改的数据被事务2给回滚了)
| 事务1 | 事务2 | |
| T1 | begin | |
| T2 | begin | |
| T3 | update xxx set password= 200 where id = 1 | |
| T4 | update xxx set password= 1000 where id = 1 | |
| T5 | commit | |
| T6 | Rollback |
这里可以看到事务1在修改完id为1的password并进行事务的提交之后,事务2在T6时刻进行了事务的回滚,这就导致了事务1对数据的修改丢失了,这是一个非常严重的错误,即自己修改的数据被被人给回滚了,在任何隔离级别的情况下都是解决了脏写问题。
- 脏读(事务1读到其他事务修改但是没有提交的信息、临时信息)
| 事务1 | 事务2 | |
| T1 | begin | |
| T2 | begin | |
| T3 | update xxx set password= 99 where id = 1 | |
| T4 | select password from xxx where id = 1 | |
| T5 | commit | |
| T6 | RollBack |
这里事务1在T4读取到了事务2针对id=1的用户的password修改,但是实际上事务2在最后进行了事务的回滚,这就导致了实际上事务1读到的是一个不存在的数据,也就是事务1读到了其他事务修改但是没有提提交的记录信息。在读已提交的隔离级别下就解决了脏读问题。
- 不可重复度(在同一事务进行多次的查询操作的时候,查询的结果是不一致的)
| 事务1 | 事务2 | |
| T1 | begin | |
| T2 | begin | |
| T3 | select password from xxx where id = 1 | |
| T4 | update xxx set password = 99 where id = 1 | |
| T5 | select password from xxx where id = 1 | |
| T6 | update xxx set password= 88 where id = 1 | |
| T7 | select password from xxx where id = 1 | |
| T8 | update xxx set password= 88 where id = 1 | |
| T9 | commit | |
| T10 | commit |
在T3、T5、T7时刻事务1对id=1的账号进行password,发现该数据一致是变化的,这就是不可重复度的问题,在同一事务中每次进行查询的时候数据都是在变化的,在可重复度的隔离级别下解决了不可重复的的问题。
- 幻读(在同一事务中查询的时候发现多了很多条记录,称为幻影记录)
| 事务1 | 事务2 | |
| T1 | begin | |
| T2 | begin | |
| T3 | select * from xxx where id > 100 | |
| T4 | insert into xxx(id,password) values (199,11) | |
| T5 | select * from xxx where id > 100 | |
| T6 | insert into xxx(id,password) values (200,11) | |
| T7 | select * from xxx where id > 100 | |
| T8 | insert into xxx(id,password) values (201,11) | |
| T9 | commit | |
| T10 | commit |
在T3、T5、T7时刻事务1对id大于100的信息进行查询的时候,发现在同一事务中每次查询的时候都会有新的数据的出现,这就是幻读问题,在可串行化(序列化)的隔离级别下解决了幻读的问题
五、混淆点&知识点
- 多次查询的的时候发现数据变少了,是幻读还是不可重复度
答:不可重复度。幻读一定是数据增多了(可以从字面意思上理解,幻读即出现幻影记录,那么就是两次读发现多了数据),如果是数据减少了,那么就是不可重复度
- 脏写和脏读的回滚问题
两者都是由于事务1在进行操作的时候其他事务回滚导致的问题,脏写是其他事务回滚导致自己写入的数据无效了,脏读则表示的是其他事务回滚导致读到的是无效的数据,由于脏写是所有事务隔离级别都解决的,所以做了解即可(一般通过加锁就可以解决)
- 四种隔离级别的问题严重性
问题严重性:脏写>脏读>不可重复读>幻读
- 在MYSQL中的事务隔离级别
在MySQL中innodb存储引擎下的隔离级别是可重复读,但是得益于innodb的MVCC版本控制,MYSQL在可重复度的隔离级别下同时解决了幻读的问题
六、四种隔离级别的比较总结
- 并发性
从字面意思上即可理解:
1.可串行化并发能力最低,所有的事务等待执行,解决所有问题,安全性高,但是效率低下
2.之后并发能力一次递增:串行化<可重复度<读已提交<读未提交
3.在实际的开发中根据业务的具体需求,权衡并发性和数据安全性选择对应的隔离级别
边栏推荐
- 【Codeforces Round #807 (Div 2.) A·B·C】
- [ciscn2019 North China Day1 web5] cyberpunk
- Export and import in ES6
- Two methods of automated testing XSS vulnerabilities using burpsuite
- 程序员必做50题
- Detailed explanation of this point in JS
- 2022.7.16DAY606
- [HarekazeCTF2019]encode_ and_ encode
- Detailed explanation of CSRF forged user request attack
- el-checkbox中的checked勾选状态问题 2021-08-02
猜你喜欢
Alibaba internal "shutter" core advanced notes~

Operator overloading
![[RootersCTF2019]I_< 3_ Flask](/img/69/1c77e45e939cf86bb75be8a6c42574.png)
[RootersCTF2019]I_< 3_ Flask

14 web vulnerability: types of SQL injection and submission injection

10个Web API

Parallel MPI program delivery send message

DOM day_ 03 (7.11) event bubbling mechanism, event delegation, to-do items, block default events, mouse coordinates, page scrolling events, create DOM elements, DOM encapsulation operations

Flink 滑动窗口理解&具体业务场景介绍
![[HFCTF2020]EasyLogin](/img/23/91912865a01180ee191a513be22c03.png)
[HFCTF2020]EasyLogin

数据库表连接的简单解释
随机推荐
3_ Jupiter notebook, numpy and mattlotlib
CUDA version difference between NVIDIA SMI and nvcc -v
[ciscn2019 finals Day2 web1]easyweb
DOM day_01(7.7) dom的介绍和核心操作
MySQL第二篇
JSCORE day_02(7.1)
JS screen detection method summary 2021-10-05
DOM day_ 01 (7.7) introduction and core operation of DOM
Flink1.11 多并行度watermark测试
[红明谷CTF 2021]write_shell
Flink 1.15实现 Sql 脚本从savepointh恢复数据
[4.10 detailed explanation of game theory]
2020-12-20 99 multiplication table
[问题]yum资源被占用怎么办
Detailed explanation of this point in JS
Learn json.stringify again
[CISCN2019 华北赛区 Day1 Web5]CyberPunk
Golang切片make与new的区别
[HarekazeCTF2019]encode_and_encode
DOM day_ 03 (7.11) event bubbling mechanism, event delegation, to-do items, block default events, mouse coordinates, page scrolling events, create DOM elements, DOM encapsulation operations