技术文摘
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 已提交数据
- Vue 中如何处理用户交互事件
- Vue 计算属性与侦听属性:差异与应用
- Vue 中使用 async/await 处理异步操作的方法
- Vue 实现权限控制的方法
- Vue 利用过渡钩子函数实现动画过渡效果的方法
- Vue 中使用过滤器处理数据的方法
- Vue中使用v-slot默认插槽的方法
- Vue使用webpack进行打包与优化的方法
- Vue 实现 V-model 自定义组件的方法
- Vue 中使用表达式计算动态样式的方法
- Vue 中运用 watch 监听响应式数据变化的方法
- Vue项目中利用NGINX实现反向代理与负载均衡的方法
- Vue项目中利用Apache实现反向代理与负载均衡的方法
- Vue 数据缓存处理的方法
- Vue 中运用 v-if、v-else-if、v-else 实现多重条件渲染的方法