2017-05-17 11 views
0

Greenplum에서 SQL 트랜잭션을 실행하려고 할 때. 이 오류가 발생했습니다. 그것은이 작동 SQL 서버에서Greenplum - 교착 상태 처리 방법

그러나 우리는

Transaction A 


RETRY: -- Label RETRY 
BEGIN TRANSACTION 
BEGIN TRY 

    truncate table tablename 
    WAITFOR DELAY '00:00:05' -- Wait for 5 ms 
    Insert into tablename 

    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    PRINT 'Rollback Transaction' 
    ROLLBACK TRANSACTION 
    IF ERROR_NUMBER() = 1205 -- Deadlock Error Number 
    BEGIN 
     WAITFOR DELAY '00:00:00.05' -- Wait for 5 ms 
     GOTO RETRY -- Go to Label RETRY 
    END 
END CATCH 

OUTPUT은 그린 플럼 (Greenplum)에 동일한 트랜잭션을 쓰고 싶다 :

Transaction (Process ID 52) was deadlocked on lock resources with 
another process and has been chosen as the deadlock victim. 
Rerun the transaction. 

우리는 시도

IT는

을 포함합니다
  1. greenplum 구문에서 언급 된 sql 트랜잭션 (retry 및 try/catch) 블록을 변환합니다.

  2. 프로세스 ID가 계속 변경되면 트랜잭션으로 전달할 때 하드 코드 값을 피하고 싶습니다.

3.이 오류는 우리가 greenplum에서 작성한 SQL SERVER OR 트랜잭션에 속한다는 것을 이해하려고합니다. talend에서

데이터 흐름은 다음과 같습니다

**Read from MS SQL SERVER >> write into hdfs >> load into greenplum** 

이 거기에 어떤 도움이 많이을 감상 할 수있다?

+0

을 시작합니다. 나는 당신이 왜 그 기다림을하는지 이해하지 못합니다. –

+0

나는 같은 테이블에 데이터를 잘라내어 삽입하는 동일한 코드를 실행하는 여러 세션을 실행하고 있다고 생각합니다. 그 맞습니까? 그렇다면 왜? –

답변

1

Greenplum의 거래 내에서 거래를 시작하거나 종료 할 수 없습니다. 자동 커밋 또는 자동 롤백.

다중 버전 동시성 제어에는 항상 데이터 일관성이 있으며 쿼리는 항상 병렬 메커니즘 내에서 순차적으로 실행됩니다.

RETRY : - 라벨 RETRY '40P01'는 PostgreSQL의에서 교착 상태에 대한 오류 코드 (SQL 상태)

truncate table tablename 
select pg_sleep(5) -- Wait for 5 ms 
Insert into tablename 

RAISE INFO 'Rollback Transaction' 

IF ERROR_NUMBER = 1205 -- Deadlock Error Number 
THEN 
select pg_sleep(5) -- Wait for 5 ms 
    -- Go to Label RETRY 
END