问题描述
使用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)