WHERE句のないUPDATEはPostgreSQLのテーブルをロックしますか?


9

テーブル全体UPDATEWHERE句を指定しない)はPostgreSQLのテーブルをロックしますか?たとえば、行が削除または挿入されるのを防ぎますか?

たとえば、実行した場合 、実行中にUPDATE t1 SET key = 'value' 新しい行が挿入されないことを期待できますか?t1UPDATE

いいえの場合UPDATE、開始後に表示された行も更新されますか?(キーのDEFAULT 'value'定義にはありません)


開始後に挿入された場所で行を更新していて、継続的に行を挿入していたプロセスがあった場合、更新ステートメントが終了しないことを意味しませんか?
ジョーW

いい視点ね!はい、UPDATE新しく挿入された行を更新するような方法で実装することはほとんど不可能です。
オリガミナル

いいえ、変更された行のみがロックされます。UPDATEはテーブル全体をロックすることはありません。
a_horse_with_no_name

回答:


15

WHERE句のないUPDATEはテーブルのすべての行をロックしますが、DMLのテーブル自体はロックしません。

行はロックされているため、別のトランザクションから削除できません。

しかし、問題なく新しい行を挿入できます(それらが制約に違反していない場合)。

UPDATEのに挿入され行は、UPDATEステートメントでは認識されないため、変更されません。


ドキュメントのリンクを共有してください。UPDATEなしについて正確に言っている公式のドキュメントではあまり見つかりませんでしたWHERE
オリガミナル

そして、別のトランザクションから更新された行も行ロックのために失敗しますよね?
tale852150

1
@origaminal問題のドキュメントはpostgresql.org/docs/current/explicit-locking.htmlにあります。最後の4つは「テーブルロック」と呼んでいます-許容ロックでもテーブルロックの形式ですが、排他ロックを取得しようとする試みを防ぎます。
SilverbackNet
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.