내용으로 건너뛰기

Amazon Redshift에서 "Serializable isolation violation on table" 또는 "Relation does not exist" 오류를 해결하려면 어떻게 해야 합니까?

3분 분량
0

여러 세션에서 Amazon Redshift 작업을 동시에 실행할 때 "Serializable isolation violation on table" 또는 "Relation does not exist" 오류가 발생합니다.

간략한 설명

Amazon Redshift의 동시 쓰기 작업은 트랜잭션이 이후에 실행될 수 있도록 직렬화할 수 있어야 합니다. 또한 직렬 실행은 트랜잭션이 동시에 실행될 때와 동일한 결과를 생성해야 합니다. 자세한 내용은 직렬화 가능한 격리를 참조하십시오.

해결 방법

직렬화 가능한 격리 오류를 해결하려면 다음 방법 중 하나를 사용하십시오.

취소된 트랜잭션 재시도

Amazon Redshift에서 동시 워크로드를 직렬화할 수 없음을 감지하면 애플리케이션 로직에 결함이 있을 수 있습니다. 오류를 일으킨 취소된 트랜잭션을 재시도합니다.

중간 커밋 사용

커밋 또는 롤백을 실행하면 트랜잭션이 완료됩니다. 테이블에서 삭제 작업을 실행하기 전에 트랜잭션이 커밋되면 새 트랜잭션이 생성되고 직렬화 가능한 격리가 유지됩니다.

다음 예제에서는 중간 COMMIT 명령을 사용합니다.

DELETE FROM XXXXX WHERE date = XXXXX';
→COMMIT;
BEGIN TRANSACTION;
DELETE FROM XXXXX WHERE date = XXXXX';

원자적이지 않은 작업을 트랜잭션 외부로 이동

두 트랜잭션 내의 개별 작업이 다른 트랜잭션의 결과에 영향을 미칠 수 있는 방식으로 서로 상호 참조하는 경우 이 방법을 사용하십시오.

결과가 다른 작업과 원자적일 필요가 없는 경우 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;

이전 트랜잭션은 직렬화할 수 있습니다. 트랜잭션을 순서대로 실행할 경우 결과는 트랜잭션을 동시에 실행할 때와 같습니다.

각 세션의 모든 테이블을 잠그고 강제로 직렬화 수행

LOCK 명령은 직렬화 가능한 격리 오류를 초래할 수 있는 작업을 차단합니다. LOCK 명령을 실행할 때 다음 단계를 완료하십시오.

  • 트랜잭션이 영향을 미치는 모든 테이블을 잠그고 트랜잭션 내부의 읽기 전용 SELECT 문이 영향을 미치는 테이블을 포함합니다.
  • 작업이 수행되는 순서에 관계없이 동일한 순서로 테이블을 잠급니다.
  • 작업을 수행하기 전에 트랜잭션 시작 시 모든 테이블을 잠급니다.

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

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

스냅샷 격리는 더 높은 동시성을 허용하므로 동일한 테이블의 서로 다른 행에 대한 동시 수정을 성공적으로 완료할 수 있습니다.

트랜잭션은 데이터베이스의 최신 커밋 버전 또는 스냅샷에서 계속 작동합니다.

데이터베이스에 스냅샷 격리를 설정하고 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 권한이 있어야 합니다.
  • 데이터베이스 환경의 격리 수준은 변경할 수 없습니다.
  • 트랜잭션 블록 내에서는 격리 수준을 변경할 수 없습니다.
  • 다른 사용자가 데이터베이스에 연결하면 alter isolation level 명령이 실패합니다.
  • alter isolation level 명령은 현재 세션의 격리 수준 설정을 변경할 수 있습니다.

자세한 내용은 직렬화 가능한 격리 오류 수정 방법을 참조하십시오.

관련 정보

ERROR:1023 DETAIL: Serializable isolation violation on a table in Redshift

ERROR:1018 DETAIL: Relation does not exist

동시 쓰기 작업 관리

AWS 공식업데이트됨 10달 전