原子性和事务

在本页面

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

多文档交易

当单个写操作(例如 db.collection.updateMany())修改多个文档时,对每个文档的修改是原子性的,但整个操作不是原子性的。

当执行多文档写操作时,无论是通过单个写操作还是通过多个写操作,其他操作都可能会交错。

对于需要原子性地读写多个文档(在单个或多个集合中)的情况,MongoDB支持多文档事务:

  • 在版本4.0中,MongoDB支持复制集上的多文档事务。
  • 在版本4.2中,MongoDB引入了分布式事务,它增加了对分片群集上多文档事务的支持,并合并了对复制集上多文档事务的现有支持。

有关MongoDB中事务的详细信息,请参阅 事务页面。

[warning] 重要

在大多数情况下,多文档事务比单文档写入带来更大的性能成本,而多文档事务的可用性不应该取代有效的模式设计。对于许多场景, 非规范化数据模型(嵌入式文档和数组)将继续是数据和用例的最佳选择。也就是说,对于许多场景,适当地对数据建模将最小化对多文档事务的需求。

有关其他事务使用注意事项(如运行时限制和oplog大小限制),请参见 生产注意事项

并发控制

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

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

另一种方法是在查询谓词中为写操作指定字段的期望当前值。

也可以看看:

阅读隔离度,一致性和近效性

译者:杨帅

校对:杨帅

参见

原文 - Atomicity and Transactions

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2020-12-18 11:34:57

results matching ""

    No results matching ""