2017-11-17 10 views
0

テーブルAに2,000万エントリ、テーブルBにさらに<百万エントリがあるとします。PostgreSQLのデッドロックが検出されました

私は、この変更は、TableBの上で何かを変更していますか?BのポインティングからA.

Process 1240: ALTER TABLE "product" ADD CONSTRAINT 
"product_top_id_56635_fk_tableb_id" FOREIGN KEY ("top_id") 
REFERENCES "tableb" ("id") DEFERRABLE INITIALLY DEFERRED 

にFKを追加しようとしている

どうしてデッドロックの原因になっていないのですか?

答えて

1

外部キーを作成してもAは変更されませんが、Aの行はロックされます。制約の作成中にこれらの値を変更または削除できないことを保証するためです。

したがって、両方のテーブルの行をロックする他のトランザクションでデッドロックが発生する可能性があります。

明示的なロックまたはメンテナンス期間を待って、Aを変更しないでください。

+0

しかし、なぜBがAの変更を気にしているのですか?整合性をチェックしないため、Aをロックする必要のないFKタイプがありますか? – EralpB

+0

外部キーは整合性制約なので、常に整合性をチェックします。それはその仕事です。完全性をチェックしたくない場合は、外部キーを定義しないでください。制約は、Bの行が依存する行を削除するのと同様に、制約を無効にするAの変更を防止する必要があります。 –

関連する問題