连续两次调用cursor.execute()返回结果不一致问题求解
问题产生原因
你遇到的随机返回1/0的问题,核心原因通常有两类:
- 主从同步延迟:如果你的数据库部署了读写分离架构,写入类操作(包括前置插入id=11的items记录、DELETE语句)会在主库执行,而SELECT查询默认路由到从库执行。主从节点之间的数据同步存在不确定的延迟,立即执行查询时数据还未同步到从库就会返回0,等待一段时间同步完成后就返回1,添加
time.sleep(1)刚好覆盖了同步延迟时间,因此问题被修复。 - 事务与游标配置不当:mysql.connector默认关闭自动提交(
autocommit=False),如果你前置的插入操作和当前代码不在同一个数据库连接,或写入操作后未显式提交事务,配合非缓冲游标使用时,连续执行SQL可能读取到未完成事务的中间状态,导致结果异常。
连续调用execute()的冲突说明
连续调用cursor.execute()本身不存在设计上的冲突,mysql.connector的游标原生支持顺序执行多条SQL语句,该问题本质是使用配置或架构层面的问题,和execute()的连续调用无关。
可行解决方案
- 强制关键读操作走主库:如果是读写分离架构导致的主从延迟,对于需要读取刚写入数据的强一致性查询,直接指定路由到主库执行,彻底规避同步延迟影响。
- 显式提交事务+开启自动提交:创建数据库连接时开启自动提交:
conn.autocommit = True,或者在所有DML(写入/修改/删除)操作执行完成后,显式调用conn.commit()提交事务,确保事务状态对后续查询可见。 - 使用缓冲游标:创建游标时开启缓冲配置:
mycursor = conn.cursor(buffered=True),驱动会自动读取完前一条SQL的所有返回结果,避免游标状态混乱导致的结果异常。 - 校验DML执行结果:执行写入类操作后,通过
mycursor.rowcount获取受影响的行数,确认操作执行成功后再执行后续查询,避免执行失败导致的结果不符合预期。
内容的提问来源于stack exchange,提问作者ns23
相关产品推荐
相关产品推荐

