脏读、幻读和不可重复读

2019-08-18  本文已影响0人  MrGeekr极氪

数据库的四大事务特征

在数据库中,事务要满足ACID:

Atomicity 原子性:

Consistent 一致性:

Isolation 隔离性:

Durable 持久性:

脏读、幻读和不可重复读的概念

脏读:

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

在这里插入图片描述

如果会话 2 更新 age 为 10,但是在 commit 之前,会话 1 希望得到 age,那么会获得的值就是更新前的值。或者如果会话 2 更新了值但是执行了 rollback,而会话 1 拿到的仍是 10。这就是脏读。

不可重复读:

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

15352628823137.png

由于在读取中间变更了数据,所以会话 1 事务查询期间的得到的结果就不一样了。

幻读:

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

15352627898696.png

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

MySQL 数据隔离级别

MySQL 里有四个隔离级别:

  1. Read uncommttied(可以读取未提交数据)
  2. Read committed(可以读取已提交数据)
  3. Repeatable read(可重复读)
  4. Serializable(可串行化)。

不同事务隔离级别有不同的效果:

[]

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

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

参考

上一篇 下一篇

猜你喜欢

热点阅读