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

MongoDB触发异常时事务无法回滚变更,求排查解决

问题分析与解决方案

你的问题核心是事务操作没有绑定到开启的会话,导致update_one操作在事务上下文之外执行,自然不会被回滚。

原因说明

MongoDB的事务要求所有参与事务的CRUD操作必须显式关联到已开启事务的会话对象。你当前的代码中,db.Coll1.update_one()和db.New92.update_one()都没有指定session参数,这些操作会绕过事务,直接以独立操作的形式提交到数据库,所以即使后续调用abort_transaction(),已经执行的更新也不会被回滚。

修正后的代码

with client.start_session() as sessi1:
    sessi1.start_transaction()
    try:
        # 关键:给每个操作加上session参数,绑定到事务会话
        rew3A = db.Coll1.update_one({Query1}, {'$set': Update_Params_1}, session=sessi1)
        1/0
        rew2A = db.New92.update_one({Query2}, {'$set': Update_Params_2}, session=sessi1)
    except Exception as er1:
        print(f'Exception is {er1}')
        sessi1.abort_transaction()
    else:
        sessi1.commit_transaction()

额外检查点

  • 确认你的集合所在数据库运行在副本集环境:MongoDB 4.2仅支持副本集上的事务,单实例部署不支持事务功能(你已经是副本集,这一点没问题)
  • 检查事务的读写关注点:如果自定义了读写关注点,需确保其支持事务(默认的readConcern="local"和writeConcern="majority"是兼容事务的)
  • 版本兼容性:pymongo 4.4与MongoDB 4.2是兼容的,无需调整版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:16:05