

# 写入转发的读取一致性
<a name="aurora-mysql-write-forwarding-consistency"></a>

您可以控制数据库集群上的读取一致性程度。读取一致性级别确定数据库集群在每次读取操作之前要等待多少时间，以确保从主集群复制某些或所有更改。您可以调整读取一致性级别，以确保会话中所有转发的写入操作在数据库集群中都可见，然后再进行任何后续查询。您还可以使用此设置来确保数据库集群上的查询始终看到来自写入器的最新更新。此设置也适用于其他会话或其他集群提交的查询。要为应用程序指定此类行为，请为 `aurora_replica_read_consistency` 数据库参数或数据库集群参数选择一个值。

**重要**  
当您想要转发写入时，请始终设置 `aurora_replica_read_consistency` 数据库参数或数据库集群参数。否则，Aurora 不会转发写入。默认情况下，此参数的值为空，因此在使用此参数时请选择一个特定值。`aurora_replica_read_consistency` 参数仅影响启用了写入转发的数据库集群或实例。

如果您提高一致性级别，您的应用程序会花更多时间等待在数据库实例之间传播更改。您可以在快速响应时间与确保在运行查询之前在其他数据库实例中进行的更改完全可用之间选择平衡。

您可以为 `aurora_replica_read_consistency` 参数指定以下值：
+ `EVENTUAL` – 在对写入器数据库实例执行写入操作之前，同一会话中写入操作的结果是不可见的。查询不会等待更新的结果可用。因此，它可能会检索较旧的数据或更新的数据，具体取决于语句的时间和复制滞后量。这与不使用写入转发的 Aurora MySQL 数据库集群的一致性相同。
+ `SESSION` – 所有使用写入转发的查询都会看到在该会话中进行的所有更改的结果。无论事务是否已提交，这些更改都是可见的。如有必要，查询将等待要复制的转发写入操作的结果。
+ `GLOBAL` – 会话会看到数据库集群中所有会话和实例上的所有已提交更改。每个查询可能会等待一段时间，该时间取决于会话滞后量。从查询开始时，如果数据库集群处于最新状态（具有来自写入器的所有已提交数据），查询将继续进行。

有关写入转发涉及的配置参数的信息，请参阅[写入转发的配置参数](aurora-mysql-write-forwarding.md#aurora-mysql-write-forwarding-params)。

**注意**  
您也可以使用 `aurora_replica_read_consistency` 作为会话变量，例如：  

```
mysql> set aurora_replica_read_consistency = 'session';
```

## 使用写入转发的示例
<a name="aurora-mysql-write-forwarding-examples"></a>

以下示例显示了 `aurora_replica_read_consistency` 参数对运行 `INSERT` 语句后跟 `SELECT` 语句的影响。根据 `aurora_replica_read_consistency` 的值和语句的时间，结果可能会有所不同。

为了实现更高的一致性，您可以在发出 `SELECT` 语句之前稍等一会。或者，Aurora 可以自动等到结果复制完成后再继续进行 `SELECT`。

有关设置数据库参数的信息，请参阅[Amazon Aurora 的参数组](USER_WorkingWithParamGroups.md)。

**Example `aurora_replica_read_consistency` 设置为 `EVENTUAL`**  
运行一个 `INSERT` 语句，紧接着运行一个 `SELECT` 语句，将返回一个 `COUNT(*)` 值，其中包含插入新行之前的行数。稍后再次运行 `SELECT` 将返回更新的行计数。这些 `SELECT` 语句不会等待。  

```
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)

mysql> insert into t1 values (6); select count(*) from t1;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)
```

**Example `aurora_replica_read_consistency` 设置为 `SESSION`**  
紧随 `INSERT` 后的一条 `SELECT` 语句会等到 `INSERT` 语句中的更改变为可见。后续 `SELECT` 语句不会等待。  

```
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.01 sec)

mysql> insert into t1 values (6); select count(*) from t1; select count(*) from t1;
Query OK, 1 row affected (0.08 sec)
+----------+
| count(*) |
+----------+
|        7 |
+----------+
1 row in set (0.37 sec)
+----------+
| count(*) |
+----------+
|        7 |
+----------+
1 row in set (0.00 sec)
```
当读取一致性设置仍设置为 `SESSION`，如果在执行一条 `INSERT` 语句后引入简短的等待，则会使更新的行计数在下一条 `SELECT` 语句运行时可用。  

```
mysql> insert into t1 values (6); select sleep(2); select count(*) from t1;
Query OK, 1 row affected (0.07 sec)
+----------+
| sleep(2) |
+----------+
|        0 |
+----------+
1 row in set (2.01 sec)
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.00 sec)
```

**Example `aurora_replica_read_consistency` 设置为 `GLOBAL`**  
在执行查询之前，每条 `SELECT` 语句都会等待，截至该语句开始时的所有数据更改均可见。每条 `SELECT` 语句的等待时间各不相同，具体取决于复制滞后。  

```
mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.75 sec)

mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.37 sec)

mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|        8 |
+----------+
1 row in set (0.66 sec)
```