내가 새 테이블을 만들려고 해요포스트 그레스 테이블을 만들 비동기
- 한 Statment
을 사용하여 테이블을 만들 - 먼저이 지점에 도달 어떤 노동자 즉, 탭을 만들려고 -
create table if not exists
'테이블이 이미 존재하는'예외는 단일 작업자 아 파크 그렇게 할 때 때문에이, 이상한 정말
를 제기 2 회 동 기적으로 두 번째로 알림을 씁니다 (예외는 아님)
내가 새 테이블을 만들려고 해요포스트 그레스 테이블을 만들 비동기
- 한 Statment
을 사용하여 테이블을 만들 - 먼저이 지점에 도달 어떤 노동자 즉, 탭을 만들려고 -
create table if not exists
'테이블이 이미 존재하는'예외는 단일 작업자 아 파크 그렇게 할 때 때문에이, 이상한 정말
를 제기 2 회 동 기적으로 두 번째로 알림을 씁니다 (예외는 아님)
대답이 아니라 재생산 방법에 대한 정보이므로 참을성 있으십시오.
두 개의 터미널 (예 : tty1
및 tty2
)을 열고 각각 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
:
ERROR: duplicate key value violates unique constraint "pg_type_typname_nsp_index"
DETAIL: Key (typname, typnamespace)=(foo, 16386) already exists.
[email protected]=#
확실하지. IMO 응용 프로그램 로직에 문제가 있습니다 ...
생성 사이의 지연으로 인해 발생하는 문제 tbl 및 커밋. 두 번째 프로세스는 tbl을 생성하고, 첫 번째 커밋을 기다립니다. 처음 커밋 할 때 두 번째 예외가 발생합니다. – gCoh
PostgreSQL의 DDL은 트랜잭션입니다. 아마도 두 번째 작업자가 테이블을 만들려고하지만 첫 번째 작업자 테이블은 이미 생성되었지만 트랜잭션은 커미트되지 않은 것입니다. 그러나 그런 경우 나는'오류 : 중복 키 값이 유일 컨 스트레인 트를 위반한다. "pg_type_typname_nsp_index"키 (typename, typnamespace) = (foo, 16386)가 이미 존재한다. " – Abelisto
로컬로 디버깅 중이며 문제는 '존재하지 않으면'stmt는 잠금이 해제되기 전에 실행됩니다. 즉, 첫 번째 프로세스는 테이블을 만들고 두 번째는 잠금을 기다리고 (테이블 생성을 완료하지 않음), 첫 번째 커밋, 잠금 해제 및 두 번째 raise 예외 - 테이블이 이미 존재합니다. – gCoh