"ERROR: 1023 DETAIL: Serializable isolation violation on table in Redshift" 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 10월 10일

다른 세션에서 동시 Amazon Redshift 작업을 실행하면 "ERROR: 1023 DETAIL: Serializable isolation violation on table in Redshift." 메시지가 표시됩니다 이 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

Amazon Redshift의 동시 쓰기 작업은 직렬화할 수 있어야 합니다. 즉, 트랜잭션이 동시 실행되는 것과 같은 결과를 생성할 수 있는 하나 이상의 순서로 트랜잭션을 순차 실행할 수 있어야 합니다. 자세한 내용은 직렬화 가능 격리를 참조하세요.

다음 방법 중 하나 또는 모두 사용하여 직렬화 가능 격리 오류를 해결합니다.

  • 원자성을 위해 동일한 트랜잭션에 없어도 되는 작업을 트랜잭션 외부로 이동
  • 각 세션에서 모든 테이블을 잠그고 직렬화 강제 실행
  • 동시 트랜잭션에 스냅샷 격리 사용

해결 방법

원자성을 위해 동일한 트랜잭션에 없어도 되는 작업을 트랜잭션 외부로 이동

두 트랜잭션 내 개별 작업이 다른 트랜잭션의 결과에 영향을 줄 수 있는 방식으로 서로 교차 참조하는 경우에 이 방법을 사용합니다. 예를 들어, 두 개 세션이 각각 트랜잭션을 시작한다고 가정합니다.

Session1_Redshift = # BEGIN;
Session2_Redshift = # BEGIN;

각 트랜잭션에서 SELECT 문의 결과는 다른 트랜잭션에 있는 INSERT 문의 영향을 받을 수 있습니다. 임의의 순서로 순차 실행하는 경우 하나의 SELECT 문 결과는 항상 트랜잭션의 동시 실행보다 하나 더 많은 행을 반환합니다. 동시 실행과 같은 결과를 생성할 수 있는 순차 실행 작업 순서가 없으므로, 마지막으로 실행한 작업으로 인해 직렬화 가능 격리 오류가 발생합니다.

Session1_redshift=# select * from tab1;
Session1_redshift =# insert into tab2 values (1);
Session2_redshift =# insert into tab1 values (1);
Session2_redshift =# select * from tab2;

SELECT 문의 결과는 중요하지 않으므로(즉, 트랜잭션에서 작업의 원자성이 중요하지 않음) 트랜잭션 외부로 SELECT 문을 이동합니다. 예를 들면 다음과 같습니다.

Session1_Redshift=# BEGIN;
Session1_Redshift = # insert into tab1 values (1)
Session1_Redshift = # END;
Session1_Redshift # select * from tab2;
Session2_Redshift # select * from tab1;
Session2_Redshift =# BEGIN;
Session2_Redshift = # insert into tab2 values (1)
Session2_Redshift = # END;

이 예제에는 트랜잭션에 교차 참조가 없습니다. 두 INSERT 문은 서로 영향을 주지 않습니다. 동시 실행과 같은 결과를 생성하는 트랜잭션의 순차 실행 순서가 하나 이상 있으므로, 트랜잭션은 직렬화할 수 있어야 합니다.

각 세션에서 모든 테이블을 잠그고 직렬화 강제 실행

LOCK 명령은 직렬화 가능 격리 오류를 일으키는 작업을 차단합니다. LOCK 명령을 사용하는 경우 다음을 수행해야 합니다.

  • 트랜잭션에서 읽기 전용 SELECT 문의 영향을 받는 테이블을 포함하여 트랜잭션의 영향을 받는 모든 테이블을 잠급니다.
  • 작업이 수행된 순서와 상관없이 동일한 순서로 테이블을 잠급니다.
  • 작업을 수행하기 전에 트랜잭션 시작 시 모든 테이블을 잠급니다.

동시 트랜잭션에 스냅샷 격리 사용

직렬화 가능 옵션은 동시에 실행 중인 트랜잭션의 순서에 따라 결과를 매핑할 수 없으면 트랜잭션이 실패할 수 있는 경우 엄격한 직렬화를 구현합니다.

스냅샷 격리 옵션은 동일 테이블 내의 서로 다른 열에 대한 동시 수정이 완료되도록 높은 동시성을 허용합니다.

트랜잭션은 데이터베이스의 마지막으로 커밋된 버전 또는 스냅샷까지 계속해서 연산됩니다.

스냅숏 격리는 CREATE DATABASE 또는 ALTER DATABASE 명령의 ISOLATION LEVEL 파라미터를 사용하여 데이터베이스에서 설정합니다.

데이터베이스에서 사용 중인 동시성 모델을 보려면 다음 예제 STV_DB_ISOLATION_LEVEL 쿼리를 실행합니다.

SELECT * FROM stv_db_isolation_level;
The database can then be altered to SNAPSHOT ISOLATION:
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;

데이터베이스의 격리 수준을 변경할 때는 다음 사항을 고려합니다.

  • 데이터베이스 격리 수준을 변경하려면 현재 데이터베이스에 대한 수퍼사용자 또는 CREATE DATABASE 권한을 보유해야 합니다.
  • DEV 데이터베이스 환경의 격리 수준은 변경할 수 없습니다.
  • 트랜잭션 블록 내에서는 격리 수준을 변경할 수 없습니다.
  • 다른 사용자가 데이터베이스에 연결된 경우 격리 수준 변경 명령이 실패합니다.
  • 격리 수준 변경 명령은 현재 세션의 격리 수준 설정을 변경할 수 있습니다.

이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?