MySQL事务:REPEATABLE READ(可重读)隔离级别下 MVCC 如何工作?
  0SnbOly3LC5t 2023年12月15日 16 0


  • SELECT:InnoDB 会根据以下条件检查每一行记录:第一,InnoDB 只查找版本早于当前事务版本的数据行,这样可以确保事务读取的行要么是在开始事务之前已经存在要么是事务自身插入或者修改过的。第二,行的删除版本号要么未定义,要么大于当前事务版本号,这样可以确保事务读取到的行在事务开始之前未被删除。
  • INSERT:InnoDB 为新插入的每一行保存当前系统版本号作为行版本号。
  • DELETE:InnoDB 为删除的每一行保存当前系统版本号作为行删除标识。
  • UPDATE:InnoDB 为插入的一行新纪录保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为删除标识保存这两个版本号,使大多数操作都不用加锁。它不足之处是每行记录都需要额外的存储空间,需要做更多的行检查工作和一些额外的维护工作。

在MySQL的REPEATABLE READ(可重读)隔离级别下,MVCC(Multi-Version Concurrency Control)机制如下工作:

  1. 事务启动时刻快照:当一个事务开始时,在REPEATABLE READ隔离级别下,MySQL会为该事务创建一个快照(snapshot),记录了数据库中所有数据的一个一致性视图。
  2. 数据行版本管理:在REPEATABLE READ隔离级别下,每个数据行都会关联一个版本号(或者称为系统版本号或事务ID)。当一个事务开始时,它会使用事务启动时刻的快照来确定可见的数据版本。
  3. 读操作:当一个事务执行读操作时,MVCC会检查数据行的版本号以及事务的启动时刻快照。只有在快照创建之前已经提交的数据行版本才是可见的,未提交的版本和在快照创建之后产生的版本对于该事务是不可见的。
  4. 写操作:当一个事务执行写操作时,MVCC会创建一个新的数据行版本,并将新版本与该事务关联。其他事务在读取时将不会看到该新版本的数据。
  5. 事务的一致性视图:在REPEATABLE READ隔离级别下,事务的一致性视图将保持不变,即事务开始时刻的快照。这意味着在同一事务中多次读取相同的数据行时,将始终返回一致的结果,即使其他事务对该数据行进行了修改。

需要注意的是,在REPEATABLE READ隔离级别下,其他事务对数据行的修改将会被阻塞,直到当前事务提交或回滚。这样可以保证在同一事务中多次读取相同的数据时,返回的结果始终一致。

总结起来,REPEATABLE READ隔离级别下的MVCC机制通过创建事务开始时刻的快照和管理数据行的版本号,实现了可重复读取的一致性视图,避免了不可重复读和幻读问题。这使得在同一事务中多次读取相同的数据时,结果保持一致,提供了一定程度的数据一致性和隔离性。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月15日 0

暂无评论

推荐阅读
0SnbOly3LC5t