2017-02-27 1 views
1

나는 Redshift에서 여러 SQL 스크립트 (하나씩 차례로)를 실행하는 python 스크립트를 가지고 있습니다. 이 SQL 스크립트의 일부 테이블은 여러 번 쿼리 할 수 ​​있습니다. 예를 들어. 테이블 t1은 한 스크립트에서 선택 될 수 있으며 다른 스크립트에서 삭제/재 작성 될 수 있습니다. 이 전체 프로세스는 하나의 트랜잭션으로 실행됩니다. 이제 때때로, 교착 상태 감지 오류가 발생하고 전체 트랜잭션이 롤백됩니다. 테이블에 교착 상태가있는 경우 테이블이 해제 될 때까지 기다렸다가 SQL 실행을 다시 시도하고 싶습니다. 다른 유형의 오류에 대해서는 트랜잭션을 롤백하고 싶습니다. 설명서에서 트랜잭션이 끝날 때까지 테이블 잠금이 해제되지 않은 것처럼 보입니다. 모든 또는 전혀 데이터 변경 (트랜잭션을 사용하여 수행되는) 달성하고 싶습니다 또한 교착 상태 처리 할 싶습니다. 이것이 어떻게 달성 될 수 있는지에 대한 제안?redshift에서 핸들 잠금

답변

0

재시도 루프를 사용하여 하나의 트랜잭션에서 참조하는 모든 SQL을 실행합니다. 아래는 동시성 문제를 처리하고 다시 시도하는 데 사용하는 논리입니다 (간결성을 위해 의사 코드). 잠금을 해제하기 위해 시스템을 무기한 대기 할 필요는 없습니다. 대신 시간이 지남에 따라 다시 시도하여 응용 프로그램에서 처리합니다.

begin transaction 
while not successful and count < 5 
    try 
     execute sql 
     commit 
    except 
     if error code is '40P01' or '55P03' 
      # Deadlock or lock not available 
      sleep a random time (200 ms to 1 sec) * number of retries 
     else if error code is '40001' or '25P02' 
      # "In failed sql transaction" or serialized transaction failure 
      rollback 
      sleep a random time (200 ms to 1 sec) * number of retries 
      begin transaction 
     else if error message is 'There is no active transaction' 
      sleep a random time (200 ms to 1 sec) * number of retries 
      begin transaction 
    increment count 

주요 구성 요소는 경우가 롤백이 필요한 알고, 모든 type of error 잡기 및 exponential backoff for retries을 가지고있다.

+0

제대로 이해하면 모든 SQL 스크립트를 완료 한 후 커밋하고 오류가 발생한 스크립트 만 롤백하는 것이 좋습니다. 교착 상태 오류가 발생하면 모든 SQL 스크립트가 하나의 트랜잭션에서 실행되도록하는 방법이 있습니까? – stech

+1

하나의 트랜잭션 내에서 모든 SQL을 실행할 것을 제안합니다 ('execute sql' 행). 교착 상태에 빠지거나 실패하면 다시 시도하십시오. savepoints에 관심이 있을지 모르지만, 직접 사용한 적이 없으며 redshift에서 사용할 수 있는지 여부는 알 수 없습니다. https://www.postgresql.org/docs/current/static/sql-savepoint.html –

+0

무시 savepoints 사용에 대한 나의 코멘트. redshift에서는 세이브 포인트 롤백을 사용할 수 없습니다. http://docs.aws.amazon.com/redshift/latest/dg/c_unsupported-postgresql-functions.html –

관련 문제