脏读、幻读和不可重复读?为啥?
前言:
- 一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
- 例子: 对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNT表中A和B的存款总额为x元不变。
Isolation 隔离性:
- 数据库允许多个并发事务同事对数据进行操作,隔离性保证各个事务相互独立,事务处理时的中间状态对其它事务是不可见的,以此防止出现数据不一致状态。
- 例子: 在Windows中,如果多个进程对同一个文件进行修改是不允许的,Windows通过这种方式来保证不同进程的隔离性。
Durable 持久性:
- 一个事务处理结束后,其对数据库的修改就是永久性的,即使系统故障也不会丢失。
脏读、幻读和不可重复读的概念
脏读:
所谓脏读是指一个事务中访问到了另外一个事务未提交的数据,如下图:
如果会话 2 更新 age 为 10,但是在 commit 之前,会话 1 希望得到 age,那么会获得的值就是更新前的值。或者如果会话 2 更新了值但是执行了 rollback,而会话 1 拿到的仍是 10。这就是脏读。
不可重复读:
一个事务查询同一条记录2次,得到的结果不一致:
由于在读取中间变更了数据,所以会话 1 事务查询期间的得到的结果就不一样了。
幻读:
一个事务查询2次,得到的记录条数不一致:
幻读是不可重复读的一种特殊场景。
MySQL 数据隔离级别
MySQL 里有四个隔离级别:
- Read uncommttied(可以读取未提交数据)
- Read committed(可以读取已提交数据)
- Repeatable read(可重复读)
- Serializable(可串行化)。
不同事务隔离级别有不同的效果:
在 InnoDB 中,默认为 Repeatable 级别,InnoDB 中使用一种被称为 next-key locking 的策略来避免幻读(phantom)现象的产生。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
获取资料:
本次给大家分享一些学习资料,里面包括:(高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)以及Java进阶学习路线图。
关注作者,私信关键词:(资料) 即可。
最后,祝大家早日学有所成!
相关推荐
DriveCar 2020-09-07
quniMdejiangyou 2020-08-15
qingjiuquan 2020-07-18
zhanbuquan 2020-07-04
liaomingwu 2020-06-25
lpfvip00 2020-06-25
zhanbuquan 2020-06-21
daillo 2020-06-17
sunysh00 2020-06-11
vincen 2020-06-10
langyue 2020-06-09
DriveCar 2020-06-09
airfling 2020-06-08
sofast 2020-06-03
weikaixxxxxx 2020-05-30
neweastsun 2020-05-27
sunysh00 2020-05-25
silencehgt 2020-07-04
variab 2020-06-13
zjx0 2020-05-20
愿天下再无BUG 2020-05-16
pengpengflyjhp 2020-05-14
MissFuTT 2020-05-11
inhumming 2020-05-10
好记忆也需烂 2020-05-10
silencehgt 2020-05-09