隔离级别
并发事务带来的问题
- 脏写
- 一个事务修改了另一个事务修改过的数据。
- 脏读
- 一个事务读取到另外一个事务未提交的数据。
- 不可重复读
- 一个事务读取同一条记录2次,得到的结果不一致
- 幻读
- 一个事务中,多次执行相同的范围查询,由于其他已提交事务的插入操作,导致每次查询的结果集中出现新的行。
- 因为粒度不是单行,所以MVCC和行锁没用
- 幻读特指新插入的行,因为修改的行通过MVCC还是读的旧版本
事务的隔离级别
- 读未提交
- 一个事务可以读到其他事务没有提交的数据(脏读),可以避免脏写
- 读已提交
- 一个事务可以读到其他事务提交的数据,可以防止脏读,但仍然可能出现不可重复读。
- 可重复读
- 一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。MySQL InnoDB 的默认隔离级别。在同一个事务中,多次读取同一行数据,结果始终保持一致。可以防止脏读和不可重复读,但仍然可能出现幻读。
- 理论上,解决了数据修改造成的不一致性,没有解决插入和删除的一致性,因此会造成幻读
- 可串行化
- 事务串行执行,完全隔离