Skip to main content

隔离级别

并发事务带来的问题

  • 脏写
    • 一个事务修改了另一个事务修改过的数据。
  • 脏读
    • 一个事务读取到另外一个事务未提交的数据。
  • 不可重复读
    • 一个事务读取同一条记录2次,得到的结果不一致
  • 幻读
    • 一个事务中,多次执行相同的范围查询,由于其他已提交事务的插入操作,导致每次查询的结果集中出现新的行。
    • 因为粒度不是单行,所以MVCC和行锁没用
    • 幻读特指新插入的行,因为修改的行通过MVCC还是读的旧版本

事务的隔离级别

  • 读未提交
    • 一个事务可以读到其他事务没有提交的数据(脏读),可以避免脏写
  • 读已提交
    • 一个事务可以读到其他事务提交的数据,可以防止脏读,但仍然可能出现不可重复读。
  • 可重复读
    • 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。MySQL InnoDB 的默认隔离级别。在同一个事务中,多次读取同一行数据,结果始终保持一致。可以防止脏读和不可重复读,但仍然可能出现幻读。
    • 理论上,解决了数据修改造成的不一致性,没有解决插入和删除的一致性,因此会造成幻读
  • 可串行化
    • 事务串行执行,完全隔离