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')即可,不会改变原有事务行为,原因如下:
- Peewee 3.x在启动事务时,会自动将连接的autocommit设为
0,事务结束后(提交/回滚)会恢复到之前的状态(默认是1,即自动提交)。 - 你通过
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
相关产品推荐
相关产品推荐

