You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python mysql-connector连接无法读取phpMyAdmin等外部连接的数据更新

问题原因

该现象由mysql-connector-python默认配置与InnoDB事务机制共同导致,不属于驱动bug:

  • mysql-connector-python默认将autocommit(自动提交)设为False,连接建立后第一次执行SQL时会隐式开启一个长事务,未手动提交/回滚的情况下事务会持续存在
  • InnoDB引擎默认事务隔离级别为REPEATABLE READ(可重复读),该级别下事务生命周期内的所有一致性读,都会读取事务首次读操作生成的数据快照,其他连接独立提交的数据变更对当前未结束的事务不可见
  • 反向操作(Python端写入、phpMyAdmin可见)正常,是因为Python端执行增删改操作后通常会调用commit()提交事务,事务提交后变更对所有其他连接可见;而phpMyAdmin端的提交操作发生在独立连接中,不会触发Python长连接的事务结束,因此Python端始终读取旧快照数据,直到断开重连开启新事务才会获取最新快照。
修复方法

根据业务场景选择对应方案即可:

  • 方案1:连接初始化时开启自动提交,适配无复杂事务需求的查询类脚本
    import mysql.connector
    db_conn = mysql.connector.connect(
        host="127.0.0.1",
        user="your_username",
        password="your_password",
        database="your_db_name",
        autocommit=True
    )
    
  • 方案2:每次执行查询前手动提交当前事务,结束旧事务以获取最新快照,适配需要手动控制事务写入逻辑的场景
    # 执行查询前先提交,结束上一个未关闭的事务
    db_conn.commit()
    cursor = db_conn.cursor()
    cursor.execute("SELECT * FROM target_table")
    result = cursor.fetchall()
    # 后续结果处理逻辑
    
  • 方案3:调整连接的事务隔离级别为READ COMMITTED(读已提交),该级别下每次查询都会生成最新快照,可直接读取其他连接已提交的变更,适配无强可重复读要求的业务场景
    db_conn = mysql.connector.connect(
        host="127.0.0.1",
        user="your_username",
        password="your_password",
        database="your_db_name"
    )
    db_conn.set_isolation_level("READ COMMITTED")
    
注意事项

不要在结果集遍历过程中执行事务提交操作,会导致游标读取异常。修改配置后可直接按原复现流程验证,无需断开重连即可读取到phpMyAdmin提交的最新数据。

内容的提问来源于stack exchange,提问作者AliYsf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 05:36:25