MySQL查询每次返回相同结果,高频更新的stock字段值无法实时获取
问题根源
你遇到的是MySQL事务隔离机制导致的快照读问题,mysql-connector默认关闭自动提交,且InnoDB存储引擎默认的隔离级别为可重复读(REPEATABLE READ)。你在循环外就建立了数据库连接,整个查询过程都在同一个未提交的事务内,每次查询读到的都是事务启动时的快照数据,不会感知到其他事务提交的字段更新。
解决方法
任选以下一种方案修改即可:
- 每次查询完成后手动提交事务:在
cursor.fetchone()执行完成后添加一行connection.commit(),主动结束当前事务,下一次查询会启动新事务读取最新已提交数据 - 建立连接时开启自动提交,修改连接初始化代码,新增
autocommit=True参数:
connection = mysql.connector.connect(host='localhost', database='minecraft', user='root', password='password', autocommit=True)
- 调整MySQL全局/会话事务隔离级别为读已提交(READ COMMITTED),该方案需要修改数据库配置,仅适合固定运行环境的场景,临时脚本不推荐使用。
可选优化建议
- 无需每次循环都新建cursor,可在循环外创建一次cursor重复使用,降低资源消耗
- 写文件后添加
file.flush()操作,避免程序意外退出时缓存内的日志未写入磁盘 - 目前代码sleep间隔为0.1秒,每秒仅查询10次,会漏掉一半的更新,若要采集全量每秒20次的更新,可将sleep间隔调整为0.05秒,或根据数据库负载调整查询频率。
内容的提问来源于stack exchange,提问作者Konstanius EU
相关产品推荐
相关产品推荐

