

# 쓰기 전달을 위한 읽기 일관성
<a name="aurora-mysql-write-forwarding-consistency"></a>

DB 클러스터에서 읽기 일관성 정도를 제어할 수 있습니다. 읽기 일관성 수준은 라이터에서 일부 또는 모든 변경 사항이 복제되도록 각 읽기 작업 전에 DB 클러스터가 대기하는 기간을 결정합니다. 읽기 일관성 수준을 조정하여 세션에서 전달된 모든 쓰기 작업이 후속 쿼리 전에 DB 클러스터에 표시되도록 할 수 있습니다. 또한 이 설정을 사용하여 DB 클러스터의 쿼리에 항상 라이터의 최신 업데이트가 표시되게 할 수 있습니다. 이 설정은 다른 세션이나 다른 클러스터에서 제출한 쿼리에도 적용됩니다. 애플리케이션에 이러한 유형의 동작을 지정하려면 `aurora_replica_read_consistency` DB 파라미터 또는 DB 클러스터 파라미터의 값을 선택합니다.

**중요**  
쓰기를 전달하려는 경우 항상 `aurora_replica_read_consistency` DB 파라미터 또는 DB 클러스터 파라미터를 설정하세요. 설정하지 않으면 Aurora가 쓰기를 전달하지 않습니다. 이 파라미터는 기본적으로 비어 있으므로, 이 파라미터를 사용할 때 특정 값을 선택하세요. `aurora_replica_read_consistency` 파라미터는 쓰기 전달이 활성화된 DB 클러스터 또는 인스턴스에만 영향을 미칩니다.

일관성 수준을 높이면 애플리케이션은 변경 사항이 DB 인스턴스 간에 전파될 때까지 더 오랜 시간 동안 대기합니다. 빠른 응답 시간과 쿼리가 실행되기 전에 다른 DB 인스턴스에서 변경한 내용을 완전히 사용할 수 있도록 보장하는 것 사이에서 균형을 선택할 수 있습니다.

`aurora_replica_read_consistency` 파라미터에 대해 다음 값을 지정할 수 있습니다.
+ `EVENTUAL` - 쓰기 작업이 라이터 DB 인스턴스에서 수행될 때까지 동일한 세션에서의 쓰기 작업 결과가 표시되지 않습니다. 쿼리는 업데이트된 결과를 사용할 수 있을 때까지 대기하지 않습니다. 따라서 명령문의 타이밍 및 복제 지연의 양에 따라 이전 데이터 또는 업데이트된 데이터를 검색하게 될 수 있습니다. 이는 쓰기 전달을 사용하지 않는 Aurora MySQL DB 클러스터와 동일한 일관성입니다.
+ `SESSION` - 쓰기 전달을 사용하는 모든 쿼리에 해당 세션에서 이루어진 모든 변경 결과가 표시합니다. 변경 내용은 트랜잭션이 커밋되었는지 여부와 상관없이 표시됩니다. 필요한 경우 전달된 쓰기 작업의 결과가 복제될 때까지 쿼리가 대기합니다.
+ `GLOBAL` - DB 클러스터의 모든 세션 및 인스턴스에서 커밋된 모든 변경 사항이 세션에 표시됩니다. 각 쿼리는 세션 지연 양에 따라 다른 기간 동안 대기할 수 있습니다. 쿼리가 시작된 시간을 기준으로, DB 클러스터가 라이터에서 커밋된 모든 데이터로 최신 상태가 되면 쿼리가 진행됩니다.

쓰기 전달과 관련된 파라미터에 대한 자세한 내용은 [쓰기 전달에 대한 구성 파라미터](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`을(를) 계속하기 전에 결과 복제가 완료될 때까지 자동으로 대기할 수 있습니다.

DB 파라미터 설정에 대한 자세한 내용은 [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`으로 설정**  
`SELECT` 명령문 직후 `INSERT`를 실행하면 `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)
```