트랜잭션 시맨틱 - Amazon Redshift

Amazon Redshift는 패치 198부터 새 Python UDF 생성을 더 이상 지원하지 않습니다. 기존 Python UDF는 2026년 6월 30일까지 계속 작동합니다. 자세한 내용은 블로그 게시물을 참조하세요.

트랜잭션 시맨틱

Redshift Iceberg 쓰기 쿼리는 ACID 및 스냅샷 격리를 지원합니다. 쓰기 트랜잭션은 원자성을 보장하며 쿼리가 예기치 않게 실패할 때 부분 업데이트를 생성하지 않습니다.

여러 Iceberg 트랜잭션을 동시에 실행할 수 있으며, 두 트랜잭션이 동일한 테이블 또는 파티션을 동시에 수정하려고 하면 트랜잭션 커밋이 실패합니다. 이렇게 하면 데이터 무결성이 보장됩니다. 이 경우 충돌을 수동으로 해결하고 실패한 쿼리를 다시 실행해야 합니다. Amazon Redshift는 충돌을 자동으로 재시도하고 해결하지 않습니다.

단일 Iceberg 쓰기 쿼리는 항상 단일 자동 커밋 트랜잭션으로 처리됩니다. CREATE 또는 INSERT 쿼리와 같은 Iceberg 쓰기 쿼리가 명시적 트랜잭션 블록에 포함된 경우 동일한 트랜잭션 블록 내에서 다른 쿼리를 실행할 수 없습니다. 트랜잭션이 실패합니다.

다음은 일부 예입니다. 첫 번째 예제는 쿼리가 완료된 후 단일 문 쿼리가 항상 자동 커밋됨을 보여줍니다. 이 시나리오에서는 새 판매 주문 테이블을 생성합니다.

CREATE TABLE sales_schema.orders ( order_id int, customer_id int, order_date date, total_amount decimal(10,2) ) USING ICEBERG LOCATION 's3://my-data-lake/sales/orders/';

이 예제는 S3 테이블 버킷에 세 부분으로 구성된 주석을 사용하여 고객 주문을 삽입하기 위한 명시적 트랜잭션 블록입니다. 트랜잭션은 INSERT 쿼리 후 자동 커밋되지 않고 대신 COMMIT 명령을 사용하여 주문 데이터를 커밋하고 삽입합니다.

BEGIN; INSERT INTO "analytics_bucket@s3tablescatalog".sales_db.orders VALUES (12345, 9876, '2024-10-30', 299.99); COMMIT;

이 예제는 주문 삽입을 테스트하지만 취소하기로 결정하는 명시적 트랜잭션 블록 롤백 시나리오입니다. INSERT 쿼리 후 트랜잭션이 자동 커밋되지 않으며 그 대신 테스트 순서를 삽입하지 않고 ROLLBACK 명령으로 롤백합니다.

BEGIN; INSERT INTO sales_schema.orders VALUES (12346, 5432, '2024-10-30', 150.75); ROLLBACK;

이 마지막 예제에서는 INSERT 쿼리와 동일한 트랜잭션 블록 내에서 다른 문을 실행하려고 할 때 순서 데이터를 삽입하지 않고 트랜잭션이 실패하는 방법을 보여줍니다. 이 시나리오에서는 주문을 삽입하고 테이블을 즉시 쿼리하려고 합니다.

BEGIN; INSERT INTO sales_schema.orders VALUES (12347, 7890, '2024-10-30', 425.50); SELECT * FROM sales_schema.orders WHERE order_id = 12347;

이에 대한 유일한 예외는 DROP TABLE 문입니다. 문은 항상 자동 커밋 문으로 작동하며 명시적 트랜잭션 블록 내에서 실행할 수 없습니다. 이는 외부 테이블의 DROP TABLE과 동일한 동작을 유지하기 위한 것입니다. 자세한 내용은 테이블 삭제를 참조하세요.

참고

Iceberg 쓰기 SQL은 저장된 프로시저 내에서 실행할 수 없습니다.