Python使用mysql.connector操作MySQL时commit前更新数据存储位置问询
问题解答
这个场景下的更新数据不会存储在运行Python代码的本地机器内存中,已经全部传输到MySQL/MariaDB服务端,存储在服务端的以下几个特定区域,仅在事务提交后才对外可见:
- 首先是InnoDB存储引擎的缓冲池(Buffer Pool):执行
UPDATE语句时,InnoDB会先将对应数据所在的数据页从磁盘加载到缓冲池的内存区域,直接在内存页上完成修改,这类修改后还未刷回磁盘的页被称为「脏页」。 - 其次是重做日志缓冲(Redo Log Buffer):修改数据页的同时,本次更新的操作记录会写入服务端内存中的重做日志缓冲,用于保证事务的崩溃安全性,后续事务提交时才会持久化到磁盘的重做日志文件。
- 同时会生成对应的Undo日志:用于事务回滚时撤销修改,同时为其他事务的多版本并发控制(MVCC)快照读提供历史版本数据,这也是其他事务查询不到未提交更新的核心原因。
另外补充说明:cursor.execute()执行完成后,对应的UPDATE SQL已经发送到数据库服务端完成了内存层面的修改,Python客户端本身不会缓存这部分更新结果。如果此时Python程序异常退出未执行commit(),服务端会自动回滚这个未提交的事务,相关修改会被直接丢弃。
内容的提问来源于stack exchange,提问作者TDo
相关产品推荐
相关产品推荐

