Python调用MySQL执行SELECT查询时rowcount值不更新不符合预期
问题原因
这是MySQL默认的事务机制导致的:
- 你使用的数据库连接默认关闭了自动提交,所有查询都默认运行在同一个未主动提交的事务中
- InnoDB引擎默认的
REPEATABLE READ(可重复读)隔离级别下,同一个事务内的所有查询都会读取事务启动时的快照,自然看不到其他连接(比如你手动修改表数据的客户端)提交的最新修改 - 重启应用会重建数据库连接、开启新事务,所以能读到最新数据,完全符合你描述的症状
解决方案
有两种常用修复方案,任选其一即可:
方案1:创建连接时开启自动提交
在初始化mydb数据库连接的代码中增加autocommit=True参数,示例:
import mysql.connector mydb = mysql.connector.connect( host="你的数据库地址", user="你的用户名", password="你的密码", database="你的库名", autocommit=True # 新增这行开启自动提交 )
开启后每次查询执行完会自动提交事务,每次查询都会读取最新的快照数据。
方案2:每次查询后手动提交事务
修改你的mysqltimedcheck函数,每次执行SELECT语句后主动提交当前事务,同时建议用完游标后主动关闭避免资源泄漏,修改后代码如下:
def mysqltimedcheck(): cursor = mydb.cursor(buffered=True) window.after(1500, mysqltimedcheck) cursor.execute("SELECT * FROM alerts WHERE shown = 0") mydb.commit() # 新增行:提交当前事务 rc = cursor.rowcount print(rc) cursor.close() # 新增行:关闭游标释放资源
内容的提问来源于stack exchange,提问作者Retroisbest
相关产品推荐
相关产品推荐

