View a markdown version of this page

Aurora DSQL의 DDL 및 분산 트랜잭션 - Amazon Aurora DSQL

Aurora DSQL의 DDL 및 분산 트랜잭션

데이터 정의 언어(DDL)는 Aurora DSQL에서 PostgreSQL과 다르게 작동합니다. Aurora DSQL에는 다중 테넌트 컴퓨팅 및 스토리지 플릿을 기반으로 구축된 다중 AZ 분산 및 비공유 데이터베이스 계층이 있습니다. 단일 프라이머리 데이터베이스 노드 또는 리더가 없으므로 데이터베이스 카탈로그가 배포됩니다. 따라서 Aurora DSQL은 DDL 스키마 변경을 분산 트랜잭션으로 관리합니다.

특히 DDL은 Aurora DSQL에서 다음과 같이 다르게 작동합니다.

동시성 제어 응답

데이터베이스 카탈로그가 분산되어 있으므로 Aurora DSQL은 DDL 스키마 변경을 카탈로그 버전을 업데이트하는 분산 트랜잭션으로 관리합니다. 이전 버전의 카탈로그 캐시 복사본이 있는 세션은 다음에 스토리지와 상호 작용할 때 SQLSTATE 코드 40001 및 OCC 코드 OC001이 포함된 동시성 제어 응답을 받을 수 있습니다.

예를 들어 다음과 같은 일련의 작업을 고려합니다.

  1. 세션 1에서 사용자는 mytable 테이블에 열을 추가합니다. 그러면 카탈로그 버전이 업데이트됩니다.

  2. 세션 2에서 사용자는 mytable에 행을 삽입하려고 시도합니다. 이 세션에는 여전히 이전 카탈로그 버전이 캐시되어 있습니다.

    Aurora DSQL은 SQL Error [40001]: ERROR: schema has been updated by another transaction (OC001)를 반환합니다.

참고

스키마 변경이 해당 트랜잭션이 시작되기 전에 이미 완료된 경우에도 OC001 응답이 발생할 수 있습니다. Aurora DSQL 쿼리 프로세서는 쿼리 실행 중에 카탈로그 변경 사항을 사후 대응적으로 검색하므로 유휴 상태인 세션은 오래된 카탈로그 버전으로 계속 작동할 수 있습니다. 재시도 시 세션은 카탈로그 캐시를 새로 고치고 일반적으로 트랜잭션이 성공합니다.

동일한 트랜잭션의 DDL 및 DML

Aurora DSQL의 트랜잭션은 하나의 DDL 문만 포함할 수 있으며 DDL 문과 DML 문을 모두 가질 수는 없습니다. 이 제한은 테이블을 생성하고 동일한 트랜잭션 내에서 동일한 테이블에 데이터를 삽입할 수 없음을 의미합니다. 예를 들어 Aurora DSQL은 다음과 같은 순차 트랜잭션을 지원합니다.

BEGIN; CREATE TABLE mytable (ID_col integer); COMMIT; BEGIN; INSERT into FOO VALUES (1); COMMIT;

Aurora DSQL은 CREATEINSERT 문을 모두 포함하는 다음 트랜잭션을 지원하지 않습니다.

BEGIN; CREATE TABLE FOO (ID_col integer); INSERT into FOO VALUES (1); COMMIT;
비동기 DDL

표준 PostgreSQL에서 CREATE INDEX와 같은 DDL 작업은 영향을 받는 테이블을 잠그므로 다른 세션의 읽기 및 쓰기에 사용할 수 없습니다. Aurora DSQL에서 이러한 DDL 문은 백그라운드 관리자를 사용하여 비동기적으로 실행됩니다. 영향을 받는 테이블에 대한 액세스는 차단되지 않습니다. 따라서 대규모 테이블의 DDL은 가동 중지 시간이나 성능 영향 없이 실행할 수 있습니다. Aurora DSQL의 비동기 작업 관리자에 대한 자세한 내용은 Aurora DSQL의 비동기 인덱스 섹션을 참조하세요.