原子性和 Transaction

在本页面

在 MongoDB 中,写操作在单个文档的级别上是原子的,即使该操作在单个文档内*修改了多个嵌入式文档。

当单个写入操作修改多个文档时,每个文档的修改都是原子的,但是整个操作不是原子的,其他操作可能会交错。

Transaction-Like Semantics

由于单个文档可以包含多个嵌入式文档,因此单个文档原子性足以满足许多实际用例。对于必须像在单个事务中一样执行一系列写操作的情况,可以在应用程序中实现two-phase commit

但是,两阶段提交只能提供类似事务的语义。使用两阶段提交可确保数据一致性,但是应用程序可能会在两阶段提交或回滚期间返回中间数据。

有关两阶段提交和回滚的更多信息,请参见执行两阶段提交

Concurrency Control

并发控制允许多个应用程序同时运行,而不会引起数据不一致或冲突。

一种方法是在只能具有唯一值的字段上创建unique index。这样可以防止插入或更新创建重复数据。在多个字段上创建唯一索引以强制字段值的组合具有唯一性。有关用例的示例,请参见update()和唯一索引findAndModify()和唯一索引

另一种方法是在查询谓词中为写操作指定字段的期望当前值。两阶段提交模式提供了一种变体,其中查询谓词包括application identifier以及写操作中数据的预期状态。

首页