2017-12-31 65 views
1

i mit Postgres und Asynchron-Task-Queue bin zu kämpfenPostgres create table asynchron

Ich versuche, eine neue Tabelle zu erstellen - was Arbeiter erreichen diesen Punkt zuerst - Erstellen Sie die Tabelle

mit dem statment

create table if not exists 

‚Tabelle ist bereits vorhanden‘ Exception ausgelöst

dies wirklich seltsam ist, denn wenn so whith einzigen Arbeiter zu tun - also versuchen, die Registerkarte zu erstellen le zweimal synchron, das zweite Mal schreibt er eine Nachricht (keine Ausnahme)

+1

PostgreSQL DDL ist transaktional. Wahrscheinlich Ihr zweiter Mitarbeiter, der versucht, eine Tabelle zu erstellen, während die erste Arbeitertabelle bereits erstellt wurde, die Transaktion jedoch noch nicht ausgeführt wurde. Aber in diesem Fall habe ich Fehler wie 'ERROR: doppelte Schlüsselwert verletzt eindeutige Einschränkung" pg_type_typname_nsp_index "DETAIL: Schlüssel (typname, typnamespace) = (foo, 16386) bereits existiert.' – Abelisto

+1

ich Debuggen lokal, und das Problem sieht wie Der 'Wenn nicht existiert' Befehl wird ausgeführt, bevor die Sperre freigegeben wird. dh der erste Prozess erstellt die Tabelle, der zweite wartet auf die Sperre (die Ausführung der create-Tabelle wird nicht beendet), beim ersten Commit wird die Sperre ausgelöst, und die zweite Ausnahme wird ausgelöst - die Tabelle existiert bereits – gCoh

Antwort

1

Nicht die Antwort, nur für Informationen, wie es reproduziert werden würde, so geduldig sein.

Öffnen Sie zwei Klemmen, sagen Sie tty1 und tty2, öffnen Sie psql in jedem.

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(); 

(Warten auf Sperre)

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]=# 

Nicht sicher, dass PostgreSQL in solchen Fällen mehr smart sein sollte. IMO etwas falsch mit der Anwendungslogik ...

+0

Das Problem der Verzögerung zwischen create tbl und commit. Der zweite Prozess ausgeführt create tbl, warten auf den ersten Commit. Wenn das erste Commit, zweite Ausnahme auslösen, genau wie Sie gezeigt haben – gCoh