技术文摘
MySQL MVCC 中 UPDATE 后 SELECT 能读到已提交数据的原因
MySQL MVCC 中 UPDATE 后 SELECT 能读到已提交数据的原因
在 MySQL 的多版本并发控制(MVCC)机制下,我们常常会好奇,为什么执行 UPDATE 操作后,紧接着的 SELECT 能够读到已提交的数据。这背后涉及到 MVCC 复杂而精妙的设计原理。
MVCC 允许在同一时间点对同一数据存在多个版本。当一个事务执行 UPDATE 操作时,它并不会直接覆盖旧的数据版本,而是生成一个新的数据版本,并标记旧版本的可见性。旧版本的数据并不会立即被删除,而是在合适的时机由 MySQL 的垃圾回收机制清理。
当 UPDATE 操作完成并提交事务时,MySQL 会通过事务系统和存储引擎的协同工作来保证数据的可见性。事务系统会记录事务的提交时间和事务 ID。存储引擎在数据页中维护每个数据版本的元数据信息,这些信息包含了创建该版本的事务 ID 以及事务的提交状态。
当执行 SELECT 操作时,MVCC 机制会发挥作用。SELECT 语句会根据当前事务的启动时间来判断哪些数据版本是可见的。如果 UPDATE 操作的事务已经提交,那么它所生成的新数据版本对于后续启动的事务来说是可见的。这是因为 MVCC 通过对比事务的启动时间和数据版本的创建事务的提交时间来决定数据的可见性。如果创建数据版本的事务已经提交,且当前事务的启动时间在其提交之后,那么这个新的数据版本就是可见的。
例如,事务 A 对某条记录执行 UPDATE 操作并提交,此时生成了新的数据版本。之后事务 B 启动并执行 SELECT 操作,由于事务 B 的启动时间在事务 A 提交之后,MVCC 机制会判定事务 A 生成的新数据版本对于事务 B 是可见的,所以事务 B 能够读取到已更新的数据。
MySQL MVCC 中 UPDATE 后 SELECT 能读到已提交数据,是事务系统和存储引擎协同工作,依据事务时间戳和数据版本可见性规则共同作用的结果,这一机制极大地提升了数据库的并发性能和数据一致性。
TAGS: update操作 SELECT查询 MySQL MVCC 已提交数据
- 几步轻松设计高性能秒杀系统
- 开发者怎样迅速熟悉新敏捷项目
- 正确的 Java 代码打日志姿势,别再乱来了!
- 滴滴出行架构专家分享:大型微服务框架设计实战
- 提升 JavaScript 条件式与匹配条件编写的技巧
- 支付平台高可用架构的详尽设计实践
- 谷歌 Dropout 专利生效,被骂三年仍卡脖子
- 2019 年必知的编程语言、框架与工具
- 高并发需预热,否则非真高并发
- 17 行 Python 代码实现情感分析,燃爆!你也能行
- 2019 年编程开发语言排名,别再犹豫!
- 新工具可一键安装 Java 环境 微软再度造福开发者
- 特朗普称美公司可与华为合作 欢迎中国学生留美
- 英国哪种编程语言最吸金:Java、JavaScript 还是 C#?
- 10 个酷炫至极的后台控制面板及 GitHub 下载链接