技术文摘
MySQL MVCC 中 update 后 select 仍能读到数据的原因
MySQL MVCC 中 update 后 select 仍能读到数据的原因
在使用 MySQL 数据库时,很多开发者会遇到这样的疑惑:执行 update 操作后,使用 select 语句却依然能够读到更新前的数据。这一现象背后的原理与 MySQL 的多版本并发控制(MVCC)机制紧密相关。
MVCC 是一种用于在数据库中实现高并发读操作的机制,它允许事务在不锁定数据行的情况下读取数据的不同版本。这大大提高了数据库的并发性能,减少了锁争用。
当执行 update 语句时,MySQL 并不会直接覆盖原有数据。实际上,它会创建一个新版本的数据行,并将旧版本的数据行标记为过期。在事务提交之前,旧版本的数据行依然存在,并且对于其他未提交的事务而言,它仍然是可见的。
在执行 select 语句时,MySQL 根据事务的隔离级别来决定读取哪个版本的数据。例如,在“读已提交”隔离级别下,事务只能读取已经提交的数据。但是,如果一个事务在 update 操作之后,另一个事务在该 update 事务提交之前执行 select 操作,那么这个 select 操作将会读取到旧版本的数据。这是因为 MVCC 机制保证了在事务提交之前,旧版本的数据行对于其他事务来说仍然是可见的。
而在“可重复读”隔离级别下,一个事务在启动时会创建一个“一致性视图”,该视图会记录当时所有活跃事务的情况。在整个事务执行过程中,所有的 select 操作都会基于这个一致性视图来读取数据,即使在事务执行过程中有数据被更新,该事务仍然会读取到事务启动时的数据版本。
MySQL MVCC 机制中 update 后 select 仍能读到数据,主要是因为 MVCC 允许读取旧版本的数据,并且事务隔离级别决定了在不同情况下事务能够看到的数据版本。理解这一机制对于优化数据库性能、避免数据不一致性问题具有重要意义。
TAGS: update操作 SELECT查询 MySQL MVCC 数据读取原因
- Linux 下搭建 ssh 并允许 root 远程访问的实现
- nginx 利用 proxy_pass 实现反向代理并隐藏端口号的方法
- Linux 服务器 Ubuntu 定时任务 Cron 每秒执行设置
- Windows Server 2019 中 DHCP 高可用的达成
- Nginx 配置浏览器缓存 加速页面展示
- Linux 磁盘空间 100%占用的排查之道
- Linux 系统环境变量修改的常用手段
- 解决 Nginx 服务器发布新版本代码的浏览器缓存清除问题
- Nginx 中反向代理、负载均衡及服务器宕机解决方案详述
- nginx proxy_pass 转发规则剖析
- nginx 配置 proxy_pass 代理转发时出现 404 问题
- Windows Server 2022 AD 域控搭建指南
- Selinux 开启时的陷阱与解决之道
- Linux 中 SElinux 的启动方法
- nginx 配置中 proxy_pass 反向代理 502 错误记录