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
相关产品推荐
相关产品推荐

