MongoDB事务更新在提交前是否会在数据库中生效?
MongoDB事务提交前的更新能否被查询到?
答案要分场景判断,核心取决于查询是否属于同一个事务会话以及读关注点(readConcern)的设置:
1. 同一个事务会话内的查询
如果查询和更新操作共用同一个事务会话(即使用同一个session对象),哪怕事务还未提交,你也能看到本次事务内的更新结果。比如你代码里执行insertOne后,用同一个session查询coll1,就能查到刚插入的文档。
2. 其他会话的查询
对于不属于当前事务会话的外部查询,默认情况下看不到未提交的事务更新,仅在特定条件下例外:
- 若外部查询的读关注点设置为
local或available,且MongoDB使用的存储引擎支持读未提交(如WiredTiger的特定场景),才可能读到未提交的脏数据,但这不是默认行为,生产环境不推荐使用。 - 绝大多数生产场景下,默认读关注点为
local,未提交的事务更新对外部会话完全不可见,直到事务成功提交。
结合你的示例代码说明
在你提供的代码逻辑中:
await coll1.insertOne({user_id: 12344, paid: true }, { session }); // 此时用同一个session查询coll1,能看到这条新插入的文档 // 但其他客户端/独立会话查询时,看不到这条文档,直到事务完成提交
只有当session.withTransaction内的所有逻辑执行完毕、事务成功提交后,外部会话才能查询到本次insertOne的结果。如果事务中途失败或被中止,该插入操作会被回滚,任何会话都无法看到这条数据。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

