【MongoDB】事务Transaction numbers are only allowed on a replica set member or mongos
·
问题描述
使用python库pymongo进行事务管理,在发生异常时session无法完成回滚。
问题定位
经过查阅,发现当MongoDB为单例运行时是无法完成回滚操作的,只有在开启副本集的时候才能使用。
解决方案
- Mongodb配置文件
replication:
oplogSizeMB: 2000
replSetName: rs0
enableMajorityReadConcern: true
-
Mongodb集群初始化
连接进入mongo,使用rs.initiate()初始化副本集。 -
示例代码
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)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)