面试题答案
一键面试- 一致性读概述
- 一致性读(Consistent Read)是InnoDB存储引擎提供的一种读取数据的方式,它保证读取到的数据是数据库在某个时间点的一致性视图,而非当前最新的数据,主要用于事务隔离级别为可重复读(Repeatable Read)和读已提交(Read Committed)。
- 实现机制
- MVCC(多版本并发控制)基础:
- InnoDB为每一行数据保存多个版本,每个版本的数据都有一个对应的事务ID(trx_id)。当事务插入或修改数据时,会生成新的版本,同时记录事务ID。
- 例如,有一个表
users
,当事务T1
插入一条用户记录('John', 25)
时,这条记录会带有T1
的事务ID。如果之后事务T2
更新该记录为('John', 26)
,则会生成一个新的版本,带有T2
的事务ID。
- Read View(读视图):
- 在一致性读中,当事务开始时,InnoDB会创建一个Read View。这个Read View包含了当前系统中活跃(未提交)的事务ID列表。
- 例如,当事务
T3
开始一致性读操作时,系统中活跃的事务有T4
和T5
,那么Read View中就会记录T4
和T5
的事务ID。
- 数据版本选择:
- 当进行一致性读时,InnoDB根据Read View来选择合适的数据版本。对于某一行数据的多个版本,若版本的事务ID小于Read View中最小的活跃事务ID,说明该版本在Read View创建之前就已经提交,这个版本是可见的。
- 若版本的事务ID大于Read View中最大的活跃事务ID,说明该版本是在Read View创建之后才生成的,这个版本不可见。
- 如果版本的事务ID在Read View的活跃事务ID列表中,只有当该事务已经提交时,这个版本才可见。
- 例如,对于上述
users
表的记录,事务T3
的Read View中有事务T4
和T5
的事务ID。若有一个数据版本的事务ID小于T4
和T5
中的最小事务ID,T3
可以读取这个版本的数据。
- 锁的作用(一致性读锁,即S锁 - 共享锁):
- 在一致性读中,虽然不会对数据加排它锁(X锁)阻止其他事务修改数据,但会对读取的数据加共享锁(S锁)。
- 这是为了防止在读取数据过程中,其他事务对数据进行修改并提交,从而保证在事务内多次读取同一数据时,看到的数据是一致的。
- 例如,事务
T3
对users
表中的某条记录加S锁后进行读取,其他事务如果要对该记录进行修改,需要先获取X锁,但由于T3
持有S锁,根据锁的兼容性,其他事务无法获取X锁,直到T3
释放S锁。
- MVCC(多版本并发控制)基础:
通过MVCC和Read View机制以及适当的锁操作(S锁),MySQL的InnoDB存储引擎实现了一致性读的数据一致性。