如何在Python中正确使用MongoDB事务

张开发
2026/4/20 1:07:56 15 分钟阅读

分享文章

如何在Python中正确使用MongoDB事务
MongoDB事务仅支持副本集或分片集群单节点不支持需显式传入session参数超时60秒不可配置writeConcern和readConcern需合理设置以保障一致性。事务只在副本集或分片集群上可用单节点 MongoDB 实例不支持事务调用 start_transaction() 会直接报错 OperationFailure: Transactions are not supported on this deployment。这是最常卡住新手的第一步。本地开发时别用 mongod --dbpath 启动单机版改用 mongod --replSet rs0 并执行 rs.initiate()Docker 中快速起副本集用官方镜像的 docker-compose.yml 示例确保包含 replication.replSetName 配置云服务如 MongoDB Atlas默认开副本集但免费共享层M0仍不支持事务——得升到 M10 或更高session 必须显式传入每个操作MongoDB Python 驱动不会自动把操作绑定到当前事务上下文漏传 session 参数等于白开事务所有写操作会立即提交回滚完全失效。每次调用 insert_one()、update_one()、delete_many() 等方法时必须加 sessionsession聚合管道中用 $out 或 $merge 写入数据时同样要传 session否则写入脱离事务控制读操作默认不参与事务隔离如需读已写未提交数据得设 read_concernReadConcern(local)但通常没必要with client.start_session() as session: with session.start_transaction(): collection_a.insert_one({x: 1}, sessionsession) # ? 正确 collection_b.update_one({y: 2}, {$set: {z: 3}}, sessionsession) # ? 正确 collection_a.insert_one({x: 2}) # ? 没传 session立刻提交事务无法回滚它事务有 60 秒超时且不可配置从 start_transaction() 开始计时超时后服务端自动中止事务并释放锁。不是客户端异常所以 try/except 捕获不到表现常是后续操作卡住或报 InvalidSession。避免在事务里做 HTTP 请求、文件读写、长循环等阻塞操作批量操作尽量用 insert_many()、bulk_write() 替代多次单条调用减少网络往返和时间消耗如果真需要长流程拆成多个短事务用业务逻辑保证最终一致性而不是强依赖单事务writeConcern 影响事务可见性与持久性事务提交时的 writeConcern 决定“成功”意味着什么。默认 w1主节点写入即返回但主节点宕机可能丢数据设 wmajority 才能保证多数节点落盘。 橙篇 百度文库发布的一款综合性AI创作工具

更多文章