mongodb 是否在批量组之间锁定?
Does mongodb lock between bulk groups?
给定一个包含以下格式文档的集合:
{
name:String,
members: [ { name:String, type: String } ]
}
假设我有一个 mongodb 批量操作,包含两个操作:
- A) 对于给定文档的列表,删除类型为 'x'
的所有成员
- B) 对于相同的给定文档列表,添加一组类型为 'x'
的成员
问题是:mongodb 会锁定 A 和 B 之间的相关文件吗?以便 A 和 B 之间的其他进程无法对目标文档的 'members' 进行修改?
不,不会。默认情况下,MongoDB 操作对于每个文档都是原子的,而不是在一组文档中(这就是批量操作)。
引自 Atomicity and Transactions 页面:
In MongoDB, a write operation is atomic on the level of a single document, even if the operation modifies multiple embedded documents within a single document.
还有:
When a single write operation (e.g. db.collection.updateMany()) modifies multiple documents, the modification of each document is atomic, but the operation as a whole is not atomic.
MongoDB 4.0支持multi-document ACID transactions但有一些限制,比如只支持replica sets,事务中的整体数据不能超过16MB。
关于 Spring,MongoDB Lovelace 版本支持 4.0 事务(DATAMONGO-1920). There are examples in this blog post Pivotal。
给定一个包含以下格式文档的集合:
{
name:String,
members: [ { name:String, type: String } ]
}
假设我有一个 mongodb 批量操作,包含两个操作:
- A) 对于给定文档的列表,删除类型为 'x' 的所有成员
- B) 对于相同的给定文档列表,添加一组类型为 'x' 的成员
问题是:mongodb 会锁定 A 和 B 之间的相关文件吗?以便 A 和 B 之间的其他进程无法对目标文档的 'members' 进行修改?
不,不会。默认情况下,MongoDB 操作对于每个文档都是原子的,而不是在一组文档中(这就是批量操作)。
引自 Atomicity and Transactions 页面:
In MongoDB, a write operation is atomic on the level of a single document, even if the operation modifies multiple embedded documents within a single document.
还有:
When a single write operation (e.g. db.collection.updateMany()) modifies multiple documents, the modification of each document is atomic, but the operation as a whole is not atomic.
MongoDB 4.0支持multi-document ACID transactions但有一些限制,比如只支持replica sets,事务中的整体数据不能超过16MB。
关于 Spring,MongoDB Lovelace 版本支持 4.0 事务(DATAMONGO-1920). There are examples in this blog post Pivotal。