2017-12-31 24 views
1
내가 포스트 그레스와 비동기 작업 큐와 사투를 벌인거야

내가 새 테이블을 만들려고 해요포스트 그레스 테이블을 만들 비동기

- 한 Statment

을 사용하여 테이블

을 만들 - 먼저이 지점에 도달 어떤 노동자 즉, 탭을 만들려고 -

create table if not exists 

'테이블이 이미 존재하는'예외는 단일 작업자 아 파크 그렇게 할 때 때문에이, 이상한 정말

를 제기 2 회 동 기적으로 두 번째로 알림을 씁니다 (예외는 아님)

+1

PostgreSQL의 DDL은 트랜잭션입니다. 아마도 두 번째 작업자가 테이블을 만들려고하지만 첫 번째 작업자 테이블은 이미 생성되었지만 트랜잭션은 커미트되지 않은 것입니다. 그러나 그런 경우 나는'오류 : 중복 키 값이 유일 컨 스트레인 트를 위반한다. "pg_type_typname_nsp_index"키 (typename, typnamespace) = (foo, 16386)가 이미 존재한다. " – Abelisto

+1

로컬로 디버깅 중이며 문제는 '존재하지 않으면'stmt는 잠금이 해제되기 전에 실행됩니다. 즉, 첫 번째 프로세스는 테이블을 만들고 두 번째는 잠금을 기다리고 (테이블 생성을 완료하지 않음), 첫 번째 커밋, 잠금 해제 및 두 번째 raise 예외 - 테이블이 이미 존재합니다. – gCoh

답변

1

대답이 아니라 재생산 방법에 대한 정보이므로 참을성 있으십시오.

두 개의 터미널 (예 : tty1tty2)을 열고 각각 psql을 엽니 다.

tty1 :

[email protected]=# begin; 
BEGIN 
*[email protected]=# create table if not exists foo(); 
CREATE TABLE 
*[email protected]=# 

tty2 :

[email protected]=# begin; 
BEGIN 
*[email protected]=# create table if not exists foo(); 

은 (락을 대기)

tty1 :

*[email protected]=# commit; 
COMMIT 

tty2 :

PostgreSQL의 같은 경우에 더 똑똑해야한다는
ERROR: duplicate key value violates unique constraint "pg_type_typname_nsp_index" 
DETAIL: Key (typname, typnamespace)=(foo, 16386) already exists. 
[email protected]=# 

확실하지. IMO 응용 프로그램 로직에 문제가 있습니다 ...

+0

생성 사이의 지연으로 인해 발생하는 문제 tbl 및 커밋. 두 번째 프로세스는 tbl을 생성하고, 첫 번째 커밋을 기다립니다. 처음 커밋 할 때 두 번째 예외가 발생합니다. – gCoh