# 读关注 "available"

version 3.6 中的新内容。

与read有关的“available”查询从实例返回数据，但不保证数据已经被写入大多数复制集成员(即可能被回滚)。

如果读操作不与因果一致的会话相关联，那么读关注“available”是对次要操作的默认读操作。

**对于分片 cluster**，\[`"available"`]\([https://docs.mongodb.com/master/reference/read-concern-available/#readconcern."available](https://docs.mongodb.com/master/reference/read-concern-available/#readconcern.%22available)") 读取问题为分区提供了更大的容忍度，因为它不会等待以确保一致性保证。但是，如果分片正在进行大块迁移，那么带有 \[`"available"`]\([https://docs.mongodb.com/master/reference/read-concern-available/#readconcern."available")读取问题的查询可能会return孤立文档，因为“本地”读取问题与“本地”读取问题不同，它不会联系分片的主服务器或配置服务器以更新元数据。](https://docs.mongodb.com/master/reference/read-concern-available/#readconcern.%22available%22%29%E8%AF%BB%E5%8F%96%E9%97%AE%E9%A2%98%E7%9A%84%E6%9F%A5%E8%AF%A2%E5%8F%AF%E8%83%BD%E4%BC%9Areturn%E5%AD%A4%E7%AB%8B%E6%96%87%E6%A1%A3%EF%BC%8C%E5%9B%A0%E4%B8%BA%E2%80%9C%E6%9C%AC%E5%9C%B0%E2%80%9D%E8%AF%BB%E5%8F%96%E9%97%AE%E9%A2%98%E4%B8%8E%E2%80%9C%E6%9C%AC%E5%9C%B0%E2%80%9D%E8%AF%BB%E5%8F%96%E9%97%AE%E9%A2%98%E4%B8%8D%E5%90%8C%EF%BC%8C%E5%AE%83%E4%B8%8D%E4%BC%9A%E8%81%94%E7%B3%BB%E5%88%86%E7%89%87%E7%9A%84%E4%B8%BB%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%88%96%E9%85%8D%E7%BD%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%BB%A5%E6%9B%B4%E6%96%B0%E5%85%83%E6%95%B0%E6%8D%AE%E3%80%82)

**对于unsharded集合**(包括独立部署或复制集部署中的集合)，\[`"local"`]\([https://docs.mongodb.com/master/reference/read-concern-local/#readconcern."local](https://docs.mongodb.com/master/reference/read-concern-local/#readconcern.%22local)") 和 \[`"available"`]\([https://docs.mongodb.com/master/reference/read-concern-available/#readconcern."available](https://docs.mongodb.com/master/reference/read-concern-available/#readconcern.%22available)") 读取问题的行为相同。

不管[read concern](https://docs.mongodb.com/master/reference/glossary/#term-read-concern)级别，节点上的最新数据可能不能反映系统中数据的最新版本。

> **也可以看看**
>
> [`orphanCleanupDelaySecs`](https://docs.mongodb.com/master/reference/parameters/#param.orphanCleanupDelaySecs)

## 可用行

读关注 **available**对于因果一致的会话和事务不可用。

## 例子

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

> **\[success] Note**
>
> 为了简化，本例假设:
>
> * 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          |

然后，下表总结了 time读取关注的读操作在 time `T`处将看到的数据的 state。

|            |           |                         |
| ---------- | --------- | ----------------------- |
| 阅读目标       | Time `T`  | 状态的数据                   |
| Primary    | After t0  | Data reflects Write0    |
| Secondary1 | Before t1 | Data reflects Writeprev |
| Secondary1 | After t1  | Data reflects Write0    |
| Secondary2 | Before t2 | Data reflects Writeprev |
| Secondary2 | After t2  | Data reflects Write0    |

译者：杨帅

校对：杨帅
