

 Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 [블로그 게시물](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)을 참조하세요.

# 동시 쓰기 예
<a name="r_Serializable_isolation_example"></a>

다음 유사 코드 예는 동시에 실행되는 트랜잭션이 어떻게 진행되는지 또는 대기하는지 보여 줍니다.

## 직렬화 가능한 격리가 포함된 동시 쓰기 예제
<a name="r_Serializable_isolation_example-serializable"></a>

### 직렬화 가능한 격리가 포함된 같은 테이블에 대한 동시 COPY 작업
<a name="r_Serializable_isolation_example-concurrent-copy-operations-into-the-same-table"></a>

트랜잭션 1은 LISTING 테이블에 행을 복사합니다.

```
begin;
copy listing from ...;
end;
```

트랜잭션 2는 별도의 세션에서 동시에 시작되며, LISTING 테이블에 더 많은 행을 복사하려 시도합니다. 트랜잭션 2는 트랜잭션 1이 LISTING 테이블에서 쓰기 잠금을 풀 때까지 기다려야 하며, 그런 다음에야 진행될 수 있습니다.

```
begin;
[waits]
copy listing from ;
end;
```

트랜잭션 하나 또는 둘 모두에 COPY 명령 대신 INSERT 명령이 포함된 경우, 똑같은 동작이 발생합니다.

### 직렬화 가능한 격리가 포함된 같은 테이블로부터의 동시 DELETE 작업
<a name="r_Serializable_isolation_example-concurrent-delete-operations-from-the-same-table"></a>

트랜잭션 1은 테이블에서 행을 삭제합니다.

```
begin;
delete from listing where ...;
end;
```

트랜잭션 2는 동시에 시작되어 같은 테이블에서 행을 삭제하려 시도합니다. 트랜잭션 2는 트랜잭션 1이 완료되기를 기다렸다가 행 삭제를 시도하므로 성공합니다.

```
begin
[waits]
delete from listing where ;
end;
```

트랜잭션 하나 또는 둘 모두에 DELETE 명령 대신 같은 테이블에 대한 UPDATE 명령이 포함된 경우, 똑같은 동작이 발생합니다.

### 직렬화 가능한 격리가 포함된 읽기 작업과 쓰기 작업이 혼합된 동시 트랜잭션
<a name="r_Serializable_isolation_example-concurrent-transactions"></a>

이 예에서 트랜잭션 1은 USERS 테이블에서 행을 삭제하고 이 테이블을 다시 로드하여 COUNT(\$1) 쿼리를 실행한 다음 ANALYZE하고 마지막으로 커밋합니다.

```
begin;
delete one row from USERS table;
copy ;
select count(*) from users;
analyze ;
end;
```

그러는 동안 트랜잭션 2가 시작됩니다. 이 트랜잭션은 추가적인 행을 USERS 테이블에 복사해 테이블을 분석한 다음 첫 번째 트랜잭션과 동일한 COUNT(\$1) 쿼리를 실행하려 시도합니다.

```
begin;
[waits]
copy users from ...;
select count(*) from users;
analyze;
end;
```

두 번째 트랜잭션은 첫 번째 트랜잭션이 완료될 때까지 기다려야 하므로 성공합니다. 이 트랜잭션의 COUNT 쿼리는 완료한 로드를 기준으로 카운트를 반환합니다.

## 스냅샷 격리를 사용한 동시 쓰기 예제
<a name="r_Serializable_isolation_example-snapshot"></a>

### 스냅샷 격리가 포함된 같은 테이블에 대한 동시 COPY 작업
<a name="r_Serializable_isolation_example-concurrent-copy-operations-into-the-same-table-snapshot"></a>

트랜잭션 1은 LISTING 테이블에 행을 복사합니다.

```
begin;
copy listing from ...;
end;
```

트랜잭션 2는 별도의 세션에서 동시에 시작되며, LISTING 테이블에 더 많은 행을 복사하려 시도합니다. 트랜잭션 2는 두 트랜잭션 중 하나가 대상 테이블 `listing`에 데이터를 써야 할 때까지 동시에 진행될 수 있으며, 이 시점에서 순차적으로 실행됩니다.

```
begin; 
//When the COPY statement from T1 needs to write data to the table, the COPY statement from T2 waits.
copy listing from ...; 
end;
```

트랜잭션 하나 또는 둘 모두에 COPY 명령 대신 INSERT 명령이 포함된 경우, 똑같은 동작이 발생합니다.

### 스냅샷 격리가 포함된 같은 테이블로부터의 동시 DELETE 작업
<a name="r_Serializable_isolation_example-concurrent-delete-operations-from-the-same-table-snapshot"></a>

스냅샷 격리가 있는 동일한 테이블로부터의 동시 DELETE 또는 UPDATE 작업은 직렬화 가능한 격리로 실행되는 작업과 동일하게 실행됩니다.

### 스냅샷 격리가 포함된 읽기 작업과 쓰기 작업이 혼합된 동시 트랜잭션
<a name="r_Serializable_isolation_example-concurrent-transactions-snapshot"></a>

스냅샷 격리가 있는 작업의 혼합으로 실행되는 동시 트랜잭션은 직렬화 가능한 격리로 실행되는 작업의 혼합이 있는 트랜잭션과 동일하게 실행됩니다.