"ERROR: 1023 DETAIL: Serializable isolation violation on table in Redshift" 오류를 해결하려면 어떻게 해야 합니까?
최종 업데이트 날짜: 2022년 2월 18일
다른 세션에서 동시 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 문의 영향을 받는 테이블을 포함하여 트랜잭션의 영향을 받는 모든 테이블을 잠급니다.
- 작업이 수행된 순서와 상관없이 동일한 순서로 테이블을 잠급니다.
- 작업을 수행하기 전에 트랜잭션 시작 시 모든 테이블을 잠급니다.