技术文摘
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 数据读取原因
- Vue中使用async/await保证服务器响应完成后输出结果的方法
- PHP7.1废弃mcrypt后用openssl_encrypt正确替代且保证加密结果一致的方法
- PHP求唯一字符串函数xx()结果是否会重复
- PHP生成唯一字符串函数是否安全可靠
- PHP8.0以上版本中@抑制符不能隐藏数据库连接致命错误的原因
- PHP中@抑制符无法隐藏数据库连接错误的原因
- Python实现PHP中array_column函数功能的方法
- PHP8.0中@抑制符失效情况及致命错误的正确处理方法
- Python模拟PHP的array_column函数的方法
- Python高效提取嵌套列表列值并转换为字典的方法
- PHP数据库连接错误:避免@抑制符失效的方法
- PHP 8.0中@为何无法隐藏致命错误
- PHP 8.0 后 @ 抑制符失效:怎样优雅处理致命错误
- PHP 致命错误抑制失败的解决办法
- PHP如何解析GET请求返回的JSON字符串并获取值