技术文摘
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 已提交数据
- Tomcat Jenkins 迁移的实现流程
- 全面剖析 Nginx 主配置文件
- Nginx 响应超时配置的设置实现
- Tomcat 日志文件全解与 catalina.out 日志清理方式汇总
- Ubuntu 系统查看网络速率的多种方式
- Nginx 请求转发配置指引
- Tomcat 启动时 JAR 包出现 Invalid byte tag in constant pool 异常的解决办法
- Nginx 实现 TCP 代理转发配置
- Nginx 部署前端 Vue 项目的实践方法
- 解决 Tomcat 部署中 war 与 war exploded 引发的问题
- Linux 删除文件后空间未释放的解决之道
- 在 Linux 中利用 Docker 下载并运行 Redis 的完整流程
- FirewallD 对网络访问方式的限制运用
- Linux 借助 crontab 命令定时执行 shell 脚本的方法
- Linux Service 服务开机自启设置教程