local
或available
读取关注级别的客户端可以读取数据,这些数据随后可能会在副本集故障转移期间回滚。local
的读操作可以读取写1的结果而看不到写2。db.collection.updateMany()
)修改多个文档时,每个文档的修改都是原子的,但整个操作不是原子的。[warning] 重要在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性并不能替代有效的架构设计。 在许多情况下,非结构化化数据模型(嵌入式文档和数组)将继续是您的数据和用例的最佳选择。 也就是说,在许多情况下,适当地对数据建模将最大程度地减少对多文档交易的需求。
Non-point-in-time
)读取操作。假设读取操作在时间t1开始并开始读取文档。然后,写操作在稍后的某个时间t2提交对其中一个文档的更新。读操作可能会看到文档的更新后版本,因此看不到数据的point-in-time快照。hint()
查询可显式强制查询使用该唯一索引。linearizable
,将写关注设置为majority
,那么这种读写模型组合可以使多个线程可以在单个文档上执行读写操作,就好像单个线程实时执行了这些操作一样 ; 也就是说,这些读写的相应计划被认为是线性的。majority
的读关注级别的读操作和具有majority
的写关注级别的写操作的关联序列具有因果关系,这由它们的顺序反映出来。 应用程序必须确保一次只有一个线程在客户端会话中执行这些操作。[warning] 重要客户端会话仅在以下情况下保证因果一致性:
读取操作的读关注级别为majority
;即返回数据已被大多数副本集成员确认并且是持久化的。 写操作的写关注级别为majority
;即要求确认该操作已应用于副本集中大多数可投票成员。
majority
读关注和majority
写关注的读取序列时,客户端将会话信息包含在每个操作中。majority
读关注的读取操作和具有majority
写关注的写入操作,即使操作出错,MongoDB也会返回操作时间和集群时间。 客户端会话跟踪操作时间和群集时间。[success] 注意对于未确认的(w:0)
写操作,MongoDB不返回操作时间和群集时间。未经确认的写入并不表示任何因果关系。尽管MongoDB在客户端会话中返回读操作和已确认写操作的操作时间和集群时间,但是只有具有majority
读关注的读取操作和具有majority
写关注的写入操作才能保证因果一致性。 有关详细信息,请参见因果一致性和读/写关注级别。
[success] 注意不同会话之间的操作可以因果一致。 MongoDB驱动程序和mongo Shell提供了推进客户端会话的操作时间和集群时间的方法。 因此,客户端可以推进一个客户端会话的群集时间和操作时间,使其与另一客户端会话的操作保持一致。
majority
读关注的读取操作和具有majority
写关注点的写入操作提供的因果一致性保证。majority
写关注级别的写操作,然后发出一个具有majority
读关注级别的从节点(即,读偏好为secondary
)读操作,则读取操作将反映写入操作后的数据库状态。提示:应用程序必须确保一次只有一个线程在客户端会话中执行这些操作。
重要**因果一致性会话只能保证对于读关注级别为majority
以及写关注级别为majority
的读取操作的因果一致性。
items
集合。 只有历史数据的end
日期为非空。 如果项目的sku
值更改,则具有旧sku
值的文档需要使用end
日期进行更新,此后,将使用当前sku
值插入新文档。 客户端可以使用因果一致的会话来确保更新在插入之前发生。