2017-12-31 113 views
1
私はpostgresのと非同期タスクキューに苦しんだ

私は新しいテーブルを作成しようとしているPostgresは、テーブルを作成する非同期

- なステートメント

を使用して、テーブル

を作成 - 最初にこの点に到達するものは何でも労働者すなわち、タブを作成しようとしている -

create table if not exists 

例外は、単一のワーカーwhithそうするときので、これは、本当に奇妙である

を上げた「テーブルはすでに存在します」 2回同期して、2回目に通知を出します(例外ではありません)。

+1

PostgreSQLのDDLはトランザクションです。おそらく、第2のワーカーは、すでに作成された最初のワーカーテーブルがテーブルを作成しようとしていますが、まだトランザクションはコミットされていません。しかし、そのような場合、私は 'エラー:重複したキー値が一意性制約に違反しています。" pg_type_typname_nsp_index "エラー:キー(typename、typnamespace)=(foo、16386)が既に存在します。" – Abelisto

+1

私はローカルで、ロックが解除される前に '存在しない場合は' stmtが実行されます。 つまり、最初のプロセスはテーブルを作成し、2番目はロックを待っています(作成テーブルの実行を終了していない)。最初にコミットし、ロックを解放し、2番目の例外例外テーブルが既に存在する。 – gCoh

答えて

1

答えはありません。

tty1tty2の2つの端末を開き、それぞれ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]=# 

ないPostgreSQLはこのような場合には、よりスマートであることを確認してください。 IMOアプリケーションロジックに問題があります...

+0

create between tblとコミット。 2番目のプロセスはtblを作成し、最初にコミットするのを待ちます。あなたが示したように、最初のコミット、2番目の例外が発生する – gCoh

関連する問題