在数据库并发控制中,隔离级别对应了不同的数据一致性要求和性能特点。MySQL 中的两个常见隔离级别是读提交(READ COMMITTED)和可重复读(REPEATABLE READ)。本文将从隔离级别、实现方式、锁定策略、并发性能和幻读问题等方面对比这两者的差异。
- 隔离级别
读提交:在此隔离级别下,一个事务只能看到其他事务已提交的更改。这意味着,同一个事务中的多次查询可能会看到不同的数据,因为其他事务在此期间可能已经提交了更改。
可重复读:在此隔离级别下,一个事务启动时看到的数据是一致的。即使其他事务提交了更改,这些更改对当前事务也不可见,确保事务内的多次查询结果一致。
- 实现方式
MySQL 使用 InnoDB 存储引擎实现这两种隔离级别。这些实现依赖于多版本并发控制(MVCC)技术,即为每个事务提供一个数据的一致性快照。
读提交:InnoDB 为每次查询创建一个新的数据快照,该快照包含了在查询开始之前已提交的所有事务所做的更改。
可重复读:InnoDB 为整个事务创建一个数据快照,该快照在事务开始时创建,并在事务执行过程中保持不变。因此,事务内的所有查询都是基于同一快照的。
- 锁定策略
读提交:InnoDB 仅在需要修改数据时使用行锁(row lock)对数据进行锁定。对于读操作,不会加锁。
可重复读:InnoDB 在读操作中使用一种称为 Next-Key Locking 的锁定策略。这种策略结合了行锁和间隙锁(gap lock),锁定被查询到的行以及这些行之间的间隙。这有助于避免幻读问题。
- 并发性能
读提交:由于仅在修改数据时加锁,读操作不受影响,因此并发性能较好。这使得读提交成为许多 OLTP(在线事务处理)系统的首选隔离级别。
可重复读:由于在读操作中使用了 Next-Key Locking,可能会导致锁的竞争,从而降低并发性能。然而,可重复读可以在一定程度上解决幻读问题。
- 幻读问题
读提交:由于仅在修改数据时加锁,读提交隔离级别并不能解决幻读问题。
可重复读:由于使用了 Next-Key Locking 策略,可重复读隔离级别可以在一定程度上解决幻读问题。但在某些情况下(如查询使用非唯一索引的列时),仍然可能出现幻读。
参考网址:
https://baijiahao.baidu.com/s?id=1764251146217248529&wfr=spider&for=pc