MST

星途 面试题库

面试题:MySQL中一致性读与锁算法的关系

在MySQL中,一致性读是如何利用锁算法来实现数据一致性的,请简要阐述其机制。
36.4万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试
  1. 一致性读概述
    • 一致性读(Consistent Read)是InnoDB存储引擎提供的一种读取数据的方式,它保证读取到的数据是数据库在某个时间点的一致性视图,而非当前最新的数据,主要用于事务隔离级别为可重复读(Repeatable Read)和读已提交(Read Committed)。
  2. 实现机制
    • 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开始一致性读操作时,系统中活跃的事务有T4T5,那么Read View中就会记录T4T5的事务ID。
    • 数据版本选择
      • 当进行一致性读时,InnoDB根据Read View来选择合适的数据版本。对于某一行数据的多个版本,若版本的事务ID小于Read View中最小的活跃事务ID,说明该版本在Read View创建之前就已经提交,这个版本是可见的。
      • 若版本的事务ID大于Read View中最大的活跃事务ID,说明该版本是在Read View创建之后才生成的,这个版本不可见。
      • 如果版本的事务ID在Read View的活跃事务ID列表中,只有当该事务已经提交时,这个版本才可见。
      • 例如,对于上述users表的记录,事务T3的Read View中有事务T4T5的事务ID。若有一个数据版本的事务ID小于T4T5中的最小事务ID,T3可以读取这个版本的数据。
    • 锁的作用(一致性读锁,即S锁 - 共享锁)
      • 在一致性读中,虽然不会对数据加排它锁(X锁)阻止其他事务修改数据,但会对读取的数据加共享锁(S锁)。
      • 这是为了防止在读取数据过程中,其他事务对数据进行修改并提交,从而保证在事务内多次读取同一数据时,看到的数据是一致的。
      • 例如,事务T3users表中的某条记录加S锁后进行读取,其他事务如果要对该记录进行修改,需要先获取X锁,但由于T3持有S锁,根据锁的兼容性,其他事务无法获取X锁,直到T3释放S锁。

通过MVCC和Read View机制以及适当的锁操作(S锁),MySQL的InnoDB存储引擎实现了一致性读的数据一致性。