# 读关注 "majority"

**在本页面**

* [性能](#性能)
* [可用性](#可用性)
* [例子](#例子)
* [存储引擎支持](#支持)
* [读关注`"majority"`和事务](#事务)
* [读关注`"majority"`和汇总](https://github.com/mongodb-china/MongoDB-CN-Manual/tree/8490376c81d56eff95abbaddc6ee414b1e1c9705/docs/MongoDB-CRUD-Operations/Read-Isolation-Read-Concern/%E6%80%BB/README.md)
* [读取自己的写入](#写入)
* [禁用读关注多数](#禁用)

对于[多文档事务](https://docs.mongodb.com/master/core/transactions/)中无关的读操作，阅读问题\*\*“majority”\*\*保证所读的数据得到了大多数复制集成员的认可(即，所读的文档是持久的，并且保证不会回滚)。

对于[多文档事务](https://docs.mongodb.com/master/core/transactions/)中的操作，只有当事务以写关注点“多数”提交时，读关注点\[`多数`]\([https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern."majority")才提供保证。否则，“多数”读取关注不能保证在事务中读取的数据。](https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern.%22majority%22%29%E6%89%8D%E6%8F%90%E4%BE%9B%E4%BF%9D%E8%AF%81%E3%80%82%E5%90%A6%E5%88%99%EF%BC%8C%E2%80%9C%E5%A4%9A%E6%95%B0%E2%80%9D%E8%AF%BB%E5%8F%96%E5%85%B3%E6%B3%A8%E4%B8%8D%E8%83%BD%E4%BF%9D%E8%AF%81%E5%9C%A8%E4%BA%8B%E5%8A%A1%E4%B8%AD%E8%AF%BB%E5%8F%96%E7%9A%84%E6%95%B0%E6%8D%AE%E3%80%82)

不管读关注级别是什么，节点上的最新数据都可能不能反映系统中数据的最新版本。

## 性能

每个复制集成员在内存中维护多数提交点处的数据视图。多数提交点是由初级计算的。为了满足读取关注\*\*"majority"\*\*，该节点从该视图返回数据，并且性能成本与其他读取关注相当。

## 可用性

无论会话和事务是否一致，都可以使用读关注\[`"majority"`]\([https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")。](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29%E3%80%82)

对于使用三成员`主-副-仲裁(PSA)`体系结构的部署，可以禁用读关注 \[`"majority"`]\([https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern."majority")”,然而，这对更改流(MongoDB](https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern.%22majority%22%29%E2%80%9D,%E7%84%B6%E8%80%8C%EF%BC%8C%E8%BF%99%E5%AF%B9%E6%9B%B4%E6%94%B9%E6%B5%81%28MongoDB) 4.0和更早版本中只使用)和分片集群上的事务有影响。有关更多信息，请参见[禁用读关注多数](https://docs.mongodb.com/master/reference/read-concern-majority/#disable-read-concern-majority).。

## 例子

考虑写入操作 Write0 到三个成员复制集的以下时间轴：

> **注意**
>
> * Write0 之前的所有写操作都已成功复制到所有成员。
> * Writeprev 是 Write0之前的写入。
> * 在 Write0之后没有发生其他写操作。

![Timeline of a write operation to a three member replica set.](https://docs.mongodb.com/manual/_images/read-concern-write-timeline.svg)

| 时间 | 事件                                         | 最新写                                   | 最新的多数写                                   |
| -- | ------------------------------------------ | ------------------------------------- | ---------------------------------------- |
| t0 | 主要适用于Write0                                | 主要：Write0 次要1：Writeprev 次要2：Writeprev | 主要：Writeprev 次要1：Writeprev 次要2：Writeprev |
| t1 | Secondary1适用于Write0                        | 主要：Write0 次要1：Write0 次要2：Writeprev    | 主要：Writeprev 次要1：Writeprev 次要2：Writeprev |
| t2 | Secondary2适用于Write0                        | 主要：Write0 次要1：Write0 次要2：Write0       | 主要：Writeprev 次要1：Writeprev 次要2：Writeprev |
| t3 | Primary知道到Secondary1的复制成功，并向客户端发送确认        | 主要：Write0 次要1：Write0 次要2：Write0       | 主要：Write0 次要1：Writeprev 次要2：Writeprev    |
| t4 | Primary 知道成功复制到 Secondary2                 | 主要：Write0 次要1：Write0 次要2：Write0       | 主要：Write0 次要1：Writeprev 次要2：Writeprev    |
| t5 | Secondary1接收通知(通过常规复制机制)以更新其最近 w：“多数”写入的快照 | 主要：Write0 次要1：Write0 次要2：Write0       | 主要：Write0 次要1：Write0 次要2：Writeprev       |
| t6 | Secondary2接收通知(通过常规复制机制)以更新其最近 w：“多数”写入的快照 | 主要：Write0 次要1：Write0 次要2：Write0       | 主要：Write0 次要1：Write0 次要2：Write0          |

然后，下表总结了具有\[`"majority"`]\([https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")读关注的读取操作在时间将看到的数据状态\`T\`。](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29%E8%AF%BB%E5%85%B3%E6%B3%A8%E7%9A%84%E8%AF%BB%E5%8F%96%E6%93%8D%E4%BD%9C%E5%9C%A8%E6%97%B6%E9%97%B4%E5%B0%86%E7%9C%8B%E5%88%B0%E7%9A%84%E6%95%B0%E6%8D%AE%E7%8A%B6%E6%80%81%60T%60%E3%80%82)

![Timeline of a write operation to a three member replica set.](https://docs.mongodb.com/manual/_images/read-concern-write-timeline.svg)

|            |          |                 |
| ---------- | -------- | --------------- |
| 阅读目标       | Time `T` | 数据状态            |
| Primary    | 在t3之前    | 数据反映了 Writeprev |
| Primary    | 在t3之后    | 数据反映了 Write0    |
| Secondary1 | 在t5之前    | 数据反映了 Writeprev |
| Secondary1 | 在t5之后    | 数据反映了 Write0    |
| Secondary2 | 在t6之前    | 数据反映了 Writeprev |
| Secondary2 | 在t6之后    | 数据反映了 Write0    |

## 存储引擎支持

阅读关注“多数”是可用的WiredTiger存储引擎。

> **提示**
>
> [serverStatus](https://docs.mongoing.com/mongodb-crud-operations/read-isolation-read-concern/read-concern-majority)命令返回[storageEngine.supportsCommittedReads](https://docs.mongoing.com/mongodb-crud-operations/read-isolation-read-concern/read-concern-majority)字段，该字段指示存储引擎是否支持\*\*”majority“\*\*读取问题。

## 读关注`"majority"`和事务

> **\[success] Note**
>
> 您可以在事务级别上而不是在单个操作级别上设置读关注。要设置事务的已读关注点，请参见[事务和已读关注点](https://docs.mongodb.com/manual/core/transactions/#transactions-read-concern)。

对于[多文档事务中的操作](https://docs.mongodb.com/manual/core/transactions/)，`"majority"`仅当事务以[写关注“多数”](https://docs.mongodb.com/manual/core/transactions/#transactions-write-concern)提交时，读关注才提供其保证。否则， \[`"majority"`]\([https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")读取关注点不能保证事务中读取的数据。](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29%E8%AF%BB%E5%8F%96%E5%85%B3%E6%B3%A8%E7%82%B9%E4%B8%8D%E8%83%BD%E4%BF%9D%E8%AF%81%E4%BA%8B%E5%8A%A1%E4%B8%AD%E8%AF%BB%E5%8F%96%E7%9A%84%E6%95%B0%E6%8D%AE%E3%80%82)

## 读关注`"majority"`和汇总

从MongoDB 4.2开始，您可以为包含[`$out`](https://docs.mongodb.com/manual/reference/operator/aggregation/out/#pipe._S_out)阶段的聚合指定[读取关注](https://docs.mongodb.com/manual/reference/read-concern/) level \[`"majority"`]\([https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern."majority")。](https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern.%22majority%22%29%E3%80%82)

在MongoDB 4.0和更早版本中，您不能包括将读取关注用于聚合的[`$out`](https://docs.mongodb.com/manual/reference/operator/aggregation/out/#pipe._S_out) 阶段\[`"majority"`]\([https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")。](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29%E3%80%82)

## 读取自己的写入

更改了 version 3.6.

从 MongoDB 3.6 开始，如果写请求确认，则可以使用因果关系一致来读取您自己的写入。

在MongoDB 3.6之前，您必须发出具有写入关注点的写入操作， 然后 对读取操作使用或关注读取，以确保单个线程可以读取自己的写入。\[`{ w: "majority" }`]\([https://docs.mongodb.com/manual/reference/write-concern/#writeconcern."majority")\[\`"majority"\`\](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")\[\`"linearizable"\`\](https://docs.mongodb.com/manual/reference/read-concern-linearizable/#readconcern."linearizable](https://docs.mongodb.com/manual/reference/write-concern/#writeconcern.%22majority%22%29\[%60%22majority%22%60]%28https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29\[%60%22linearizable%22%60]%28https://docs.mongodb.com/manual/reference/read-concern-linearizable/#readconcern.%22linearizable)").

在MongoDB 3.6之前，你必须使用\[`{ w: "majority" }`]\([https://docs.mongodb.com/master/reference/write-concern/#writeconcern."majority](https://docs.mongodb.com/master/reference/write-concern/#writeconcern.%22majority)") 写关注点来发布写操作，然后使用\[`"majority"`]\([https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern."majority")或\[\`"linearizable"\`\](https://docs.mongodb.com/master/reference/read-concern-linearizable/#readconcern."linearizable](https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern.%22majority%22%29%E6%88%96\[%60%22linearizable%22%60]%28https://docs.mongodb.com/master/reference/read-concern-linearizable/#readconcern.%22linearizable)") 的读关注点来执行读操作，以确保单个线程可以读取自己的写操作。

## 禁用读关注多数

适用于3成员`主-副-仲裁器`体系结构

\[`"majority"`]\([https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")如果您具有具有主要-次要仲裁器（PSA）体系结构的三成员复制集或具有三成员PSA分片的分片群集，则可以禁用读关注。](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29%E5%A6%82%E6%9E%9C%E6%82%A8%E5%85%B7%E6%9C%89%E5%85%B7%E6%9C%89%E4%B8%BB%E8%A6%81-%E6%AC%A1%E8%A6%81%E4%BB%B2%E8%A3%81%E5%99%A8%EF%BC%88PSA%EF%BC%89%E4%BD%93%E7%B3%BB%E7%BB%93%E6%9E%84%E7%9A%84%E4%B8%89%E6%88%90%E5%91%98%E5%A4%8D%E5%88%B6%E9%9B%86%E6%88%96%E5%85%B7%E6%9C%89%E4%B8%89%E6%88%90%E5%91%98PSA%E5%88%86%E7%89%87%E7%9A%84%E5%88%86%E7%89%87%E7%BE%A4%E9%9B%86%EF%BC%8C%E5%88%99%E5%8F%AF%E4%BB%A5%E7%A6%81%E7%94%A8%E8%AF%BB%E5%85%B3%E6%B3%A8%E3%80%82)

> **\[success] Note**
>
> 如果您使用的是 3-member PSA 以外的部署，则无需禁用多数读关注。

对于三成员PSA架构，缓存压力将增加，如果任何承载数据的节点是关闭的。为了防止存储缓存压力使PSA架构的部署无法被锁定，您可以通过设置以下任一项来禁用read concern:

* [`--enableMajorityReadConcern`](https://docs.mongodb.com/manual/reference/program/mongod/#cmdoption-mongod-enablemajorityreadconcern)的命令行选项`false`。
* [`replication.enableMajorityReadConcern`](https://docs.mongodb.com/manual/reference/configuration-options/#replication.enableMajorityReadConcern)配置文件设置为`false`。

要检查是否已禁用“大多数”的读关注，您可以[`db.serverStatus()`](https://docs.mongodb.com/manual/reference/method/db.serverStatus/#db.serverStatus)在[`mongod`](https://docs.mongodb.com/manual/reference/program/mongod/#bin.mongod)实例上运行 并检查该[`storageEngine.supportsCommittedReads`](https://docs.mongodb.com/manual/reference/command/serverStatus/#serverstatus.storageEngine.supportsCommittedReads)字段。如果为`false`，则禁用“大多数”关注。

> **\[warning] 重要**
>
> 通常，除非必要，否则请避免禁用\[`"majority"`]\([https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern."majority](https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern.%22majority)") 读取问题。但是，如果您的 three-member 复制集具有 `主-副-仲裁(PSA)`体系结构 或带有 three-member PSA 分片的分片 cluster，请禁用以防止存储缓存压力导致部署无法运行。 禁用“多数”读取问题会禁用对改变流的支持。

**变更流**

禁用\[`"majority"`]\([https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")读取关注会禁用对MongoDB](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29%E8%AF%BB%E5%8F%96%E5%85%B3%E6%B3%A8%E4%BC%9A%E7%A6%81%E7%94%A8%E5%AF%B9MongoDB) 4.0及更早版本的[变更流的](https://docs.mongodb.com/manual/changeStreams/)支持。对于MongoDB 4.2+，禁用读取关注\*\*"majority"\*\*不会影响变更流的可用性。

**事务次数**

禁用\[`"majority"`]\([https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")读取关注会影响对分片群集上\[事务的\](https://docs.mongodb.com/manual/core/transactions/)支持](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29%E8%AF%BB%E5%8F%96%E5%85%B3%E6%B3%A8%E4%BC%9A%E5%BD%B1%E5%93%8D%E5%AF%B9%E5%88%86%E7%89%87%E7%BE%A4%E9%9B%86%E4%B8%8A\[%E4%BA%8B%E5%8A%A1%E7%9A%84]%28https://docs.mongodb.com/manual/core/transactions/%29%E6%94%AF%E6%8C%81) 。特别：

* \[`"snapshot"`]\([https://docs.mongodb.com/manual/reference/read-concern-snapshot/#readconcern."snapshot")如果事务涉及已\[禁用读取关注“多数”的分片\](https://docs.mongodb.com/manual/reference/read-concern-majority/#disable-read-concern-majority)，则该事务不能使用读取关注。](https://docs.mongodb.com/manual/reference/read-concern-snapshot/#readconcern.%22snapshot%22%29%E5%A6%82%E6%9E%9C%E4%BA%8B%E5%8A%A1%E6%B6%89%E5%8F%8A%E5%B7%B2\[%E7%A6%81%E7%94%A8%E8%AF%BB%E5%8F%96%E5%85%B3%E6%B3%A8%E2%80%9C%E5%A4%9A%E6%95%B0%E2%80%9D%E7%9A%84%E5%88%86%E7%89%87]%28https://docs.mongodb.com/manual/reference/read-concern-majority/#disable-read-concern-majority%29%EF%BC%8C%E5%88%99%E8%AF%A5%E4%BA%8B%E5%8A%A1%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8%E8%AF%BB%E5%8F%96%E5%85%B3%E6%B3%A8%E3%80%82)
* 如果事务的任何读或写操作写入多个分片错误，则该事务涉及已禁用读取关注的分片\[`"majority"`]\([https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")。](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29%E3%80%82)

但是，它不影响复制集上的[事务](https://docs.mongodb.com/manual/core/transactions/)。对于复制集上的事务，即使禁用了读关注，也可以为多文档事务指定读关注\[`"majority"`]\([https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")（或\[\`"snapshot"\`\](https://docs.mongodb.com/manual/reference/read-concern-snapshot/#readconcern."snapshot](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29%EF%BC%88%E6%88%96\[%60%22snapshot%22%60]%28https://docs.mongodb.com/manual/reference/read-concern-snapshot/#readconcern.%22snapshot)") 或\[`"local"`]\([https://docs.mongodb.com/manual/reference/read-concern-local/#readconcern."local")）\[\`"majority"\`\](https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern."majority")。](https://docs.mongodb.com/manual/reference/read-concern-local/#readconcern.%22local%22%29%EF%BC%89\[%60%22majority%22%60]%28https://docs.mongodb.com/manual/reference/read-concern-majority/#readconcern.%22majority%22%29%E3%80%82)

**回滚的注意事项**

禁用\[`"majority"`]\([https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern."majority")读关注可以防止修改索引的\[\`collMod\`\](https://docs.mongodb.com/master/reference/command/collMod/#dbcmd.collMod](https://docs.mongodb.com/master/reference/read-concern-majority/#readconcern.%22majority%22%29%E8%AF%BB%E5%85%B3%E6%B3%A8%E5%8F%AF%E4%BB%A5%E9%98%B2%E6%AD%A2%E4%BF%AE%E6%94%B9%E7%B4%A2%E5%BC%95%E7%9A%84\[%60collMod%60]%28https://docs.mongodb.com/master/reference/command/collMod/#dbcmd.collMod)) 命令回滚。如果需要[回滚](https://docs.mongodb.com/master/core/replica-set-rollbacks/#replica-set-rollbacks)此类操作，则必须将受影响的节点与主节点重新同步。
