脏读、幻读和不可重复读?为啥?

clipboard.png
前言:数据库

一致性是指在事务开始以前和事务结束之后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
例子: 对银行转账事务,无论事务成功仍是失败,应该保证事务结束后ACCOUNT表中A和B的存款总额为x元不变。
Isolation 隔离性:并发

数据库容许多个并发事务同事对数据进行操做,隔离性保证各个事务相互独立,事务处理时的中间状态对其它事务是不可见的,以此防止出现数据不一致状态。
例子: 在Windows中,若是多个进程对同一个文件进行修改是不容许的,Windows经过这种方式来保证不一样进程的隔离性。
Durable 持久性:性能

一个事务处理结束后,其对数据库的修改就是永久性的,即便系统故障也不会丢失。
脏读、幻读和不可重复读的概念spa

脏读:blog

所谓脏读是指一个事务中访问到了另一个事务未提交的数据,以下图:进程

clipboard.png
若是会话 2 更新 age 为 10,可是在 commit 以前,会话 1 但愿获得 age,那么会得到的值就是更新前的值。或者若是会话 2 更新了值可是执行了 rollback,而会话 1 拿到的还是 10。这就是脏读。事务

不可重复读:ip

一个事务查询同一条记录2次,获得的结果不一致:it

clipboard.png
因为在读取中间变动了数据,因此会话 1 事务查询期间的获得的结果就不同了。io

幻读:

一个事务查询2次,获得的记录条数不一致:

clipboard.png
幻读是不可重复读的一种特殊场景。

MySQL 数据隔离级别

MySQL 里有四个隔离级别:

Read uncommttied(能够读取未提交数据)
Read committed(能够读取已提交数据)
Repeatable read(可重复读)
Serializable(可串行化)。
不一样事务隔离级别有不一样的效果:

clipboard.png
在 InnoDB 中,默认为 Repeatable 级别,InnoDB 中使用一种被称为 next-key locking 的策略来避免幻读(phantom)现象的产生。

隔离级别越高,越能保证数据的完整性和一致性,可是对并发性能的影响也越大。

相关文章
相关标签/搜索