技术文摘
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 已提交数据
- SQL Server 数据库连接与子查询的实战示例
- Redis 五种数据类型全面解析
- Sql Server 2008 精简版及 Management Studio Express 首次安装使用图文指南
- SQL Server 2008 Express 与 Management Studio Express 下载安装配置指南
- SQL Server 2008 数据库定期自动备份设置方法
- SQLServer 网站搭建实例深度剖析
- SQL Server 2012 群集安装指南
- SQL Server 2008 R2 安装配置方法图文全解
- Sql Server 2008R2 升级至 Sql Server 2012 的图文指南
- SQL Server 2008 R2 安装配置的图文指南
- SQL Server 2008 评估期结束的解决办法
- 在 SQL Server 2008 R2 中借助 Cross apply 统计最新及最近数据
- Java 中整数转中文大写金额的实现方法
- SQL Server 2008 详细安装图解
- Win2003 系统中 SQL Server 2008 安装详细图解教程