问题描述

使用python库pymongo进行事务管理,在发生异常时session无法完成回滚。

问题定位

经过查阅,发现当MongoDB为单例运行时是无法完成回滚操作的,只有在开启副本集的时候才能使用。

解决方案

  1. Mongodb配置文件
replication:
	oplogSizeMB: 2000
	replSetName: rs0
	enableMajorityReadConcern: true
  1. Mongodb集群初始化
    连接进入mongo,使用rs.initiate()初始化副本集。

  2. 示例代码

import pymongo
mongo_conn = pymongo.MongoClient(host=settings['mongo_host'], port=settings['mongo_port'],username=settings['mongo_username'], password=settings['mongo_password'])

mongo_db = self.mongo_conn[settings['db_name']]

collection = mongo_db["collection_name"]

session = self.mongo_conn.start_session(causal_consistency=True)
try:
    session.start_transaction()
    res = collection.insert_many(entities, session=session)
except Exception as e:
    session.abort_transaction()
else:
    session.commit_transaction()
finally:
    session.end_session()

注:在进行数据操作时一定要指定session, 如insert_many(entities, session=session)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐