脏读&幻读

必要知识点

mysql的事务隔离级别:

  1. Read Uncommitted (读未提交)
    • 该隔离级别的事务会读到其它未提交事务的数据,此现象也称之为 脏读 .
  2. Read Committed (读提交)
    • Oracle 和 SQL Server 的默认隔离级别.
  3. REPEATABLE READ (可重复读)
    • MySQL 默认的隔离级别.
    • 在begin开启事务后,select始终读到是事务开始时间点的状态.
    • 会产生幻读.
  4. SERIALIZABLE (序列化)
    • 串行顺序执行.
    • InnoDB 引擎会给读操作隐式加一把读共享锁,从而避免了脏读、不可重读复读和幻读问题.

什么是脏读?

当一个事务修改了另外一个事务未提交的数据时,既产生了脏读(Read Uncommitted)。

什么是幻读?

基于mysql的可重复读的事务隔离级别下存在的幻读现象。
因为此级别虽然不能读到其他事务已经提交的数据,但是在数据的写上会存在直接影响。
比如这个事务虽然在读取某行数据上是不存在的,但是却可以能够能够update、delete这行不存在的数据(这个不存在是相对于当前事务的,实质上是其他事务已经提交过的数据,只是无法被当前事务读取而已),这就是幻读现象。
Oracle 数据库对于幻读的定义可能有所不同。

参考:

  1. MySQL 事务隔离级别和锁
  2. 面试官:什么是脏读、幻读?
原文地址:https://www.cnblogs.com/xiangcaiduoyidian/p/14178770.html