다른 세션에서 동시 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);
Session1_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 문의 영향을 받는 테이블을 포함하여 트랜잭션의 영향을 받는 모든 테이블을 잠급니다.
  • 작업이 수행된 순서와 상관없이 동일한 순서로 테이블을 잠급니다.
  • 작업을 수행하기 전에 트랜잭션 시작 시 모든 테이블을 잠급니다.

페이지 내용이 도움이 되었습니까? | 아니요

AWS 지원 지식 센터로 돌아가기

도움이 필요하십니까? AWS 지원 센터를 방문하십시오.

게시 날짜: 2017년 3월 3일

업데이트 날짜: 2019년 3월 21일