

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 寫入轉送的讀取一致性
<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>

下列範例顯示在執行 `INSERT` 陳述式後接著執行 `SELECT` 陳述式時 `aurora_replica_read_consistency` 參數的效果。視 `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)
```