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

Peewee升级至3.17.x后自动提交行为异常问题咨询

解决方案:适配Peewee 3.17.x的事务行为

问题根源

Peewee 3.16版本对自动提交(autocommit)机制做了破坏性变更,框架现在会自动管理事务期间的autocommit状态。你自定义的begin方法中手动执行set autocommit=0,会干扰框架的状态恢复逻辑——事务结束后,连接的autocommit会被卡在0,导致后续无事务包裹的SQL操作无法自动提交。

正确的适配方式

直接移除self.execute_sql('set autocommit=0')即可,不会改变原有事务行为,原因如下:

  1. Peewee 3.x在启动事务时,会自动将连接的autocommit设为0,事务结束后(提交/回滚)会恢复到之前的状态(默认是1,即自动提交)。
  2. 你通过DB.transaction()调用事务的方式,完全符合框架的事务管理逻辑,移除手动设置后,框架会正确处理autocommit的切换,和你在Peewee 2.x中的预期行为一致。

自定义begin方法的正确写法

如果需要保留begin方法中的其他自定义逻辑(比如连接重试之外的操作),应该调用父类的begin方法,而非完全重写:

class SQLDb(MySQLDatabase):
    def connect(self, *args, **kwargs):
        attempts = 5
        while attempts > 0:
            # 你的连接重试逻辑
            try:
                return super().connect(*args, **kwargs)
            except Exception:
                attempts -= 1
                # 可选:添加重试间隔
                time.sleep(1)
        raise ConnectionError("Failed to connect after 5 attempts")

    def begin(self):
        # 这里可以添加自定义前置逻辑(比如日志、钩子)
        super().begin()  # 让父类处理autocommit和begin的逻辑

验证事务行为

  • 事务内的操作:依然会在commit时批量提交,rollback时全部回滚,和之前一致。
  • 非事务操作:框架会恢复autocommit为1,每条SQL执行后自动提交,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:58:10