私は新しいテーブルを作成しようとしているPostgresは、テーブルを作成する非同期
- なステートメント
を使用して、テーブルを作成 - 最初にこの点に到達するものは何でも労働者すなわち、タブを作成しようとしている -
create table if not exists
例外は、単一のワーカーwhithそうするときので、これは、本当に奇妙である
を上げた「テーブルはすでに存在します」 2回同期して、2回目に通知を出します(例外ではありません)。
私は新しいテーブルを作成しようとしているPostgresは、テーブルを作成する非同期
- なステートメント
を使用して、テーブルを作成 - 最初にこの点に到達するものは何でも労働者すなわち、タブを作成しようとしている -
create table if not exists
例外は、単一のワーカーwhithそうするときので、これは、本当に奇妙である
を上げた「テーブルはすでに存在します」 2回同期して、2回目に通知を出します(例外ではありません)。
答えはありません。
tty1
とtty2
の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アプリケーションロジックに問題があります...
create between tblとコミット。 2番目のプロセスはtblを作成し、最初にコミットするのを待ちます。あなたが示したように、最初のコミット、2番目の例外が発生する – gCoh
PostgreSQLのDDLはトランザクションです。おそらく、第2のワーカーは、すでに作成された最初のワーカーテーブルがテーブルを作成しようとしていますが、まだトランザクションはコミットされていません。しかし、そのような場合、私は 'エラー:重複したキー値が一意性制約に違反しています。" pg_type_typname_nsp_index "エラー:キー(typename、typnamespace)=(foo、16386)が既に存在します。" – Abelisto
私はローカルで、ロックが解除される前に '存在しない場合は' stmtが実行されます。 つまり、最初のプロセスはテーブルを作成し、2番目はロックを待っています(作成テーブルの実行を終了していない)。最初にコミットし、ロックを解放し、2番目の例外例外テーブルが既に存在する。 – gCoh