事务隔离级别
事务:是一组不可分割的操作;
事务的 ACID 特性:
- 原子性:即不可分割
- 一致性:数据库的完整性约束
- 隔离性:事务串行执行,彼此不干扰
- 持续性:事务完成了就不可恢复
事务并发会产生一些问题:
- 脏读:由于 B 的修改被回滚,导致 A 读到了 B 更新的数据,而数据库数据被回滚到原来的;
- 不可重复读:多次读取同一数据时,由于别的事务修改,导致多次读数据不一致;
- 幻读:由于 B 的新增或删除被回滚,导致 A 读到的数据是 B 事务完成之后的结果,而实际上存储的是原来的没变;
四个事务隔离级别:(从低到高)
- Read uncommitted:事务可以读取到另一个未提交(committed)事务的结果,会导致脏读;
- Read commited:要等另一个事务提交(committed)之后才可以读取数据,解决了脏读问题,没有解决不可重复读;
- Repeatable read:事务开启时不允许修改操作,解决了不可重复读问题,没有解决幻读;
- Serializable:事务串行化,解决了所有并发带来的一致性问题,但效率低下;
MySQL 默认事务隔离级别是 Repeatable read。 MySQL 通过 GAP 锁解决幻读问题。