Блокирует ли UPDATE без предложения WHERE таблицу в PostgreSQL?

9

Вся таблица UPDATE(без указания WHEREпредложения) блокирует таблицу в PostgreSQL? Например, это предотвращает удаление / вставку строк?

Например, если я запускаю UPDATE t1 SET key = 'value' Могу ли я ожидать, что новые строки не будут вставлены t1во время UPDATEвыполнения?

Если нет, могу ли я ожидать UPDATEобновления даже строк, появившихся после его запуска? (ключ не имеет DEFAULT 'value'в своем определении)

origaminal
источник
Если бы он обновлял строки, которые были вставлены после того, как он начался, и был процесс, который непрерывно вставлял строки, это не означало бы, что оператор обновления никогда не завершится?
Джо W
хорошая точка зрения! Да, вряд ли возможно UPDATEреализовать таким образом, чтобы обновлять вновь вставленные строки.
origaminal
Нет, блокируются только те строки, которые были изменены. ОБНОВЛЕНИЕ никогда не блокирует всю таблицу.
a_horse_with_no_name

Ответы:

15

UPDATE без предложения WHERE заблокирует все строки в таблице, но не заблокирует саму таблицу для DML.

Строки не могут быть удалены из другой транзакции, потому что они заблокированы.

Но вы можете вставлять новые строки без проблем (при условии, что они не нарушают никаких ограничений).

Любая строка, вставленная после UPDATE, не будет видна оператору UPDATE и, следовательно, не будет изменена.

a_horse_with_no_name
источник
не могли бы вы поделиться ссылками на документы. Я не нашел много в официальной документации, в которой говорилось о том, что было UPDATEбез WHERE.
19
И строки, ОБНОВЛЕННЫЕ от другой транзакции, также потерпят неудачу из-за блокировок строк, правильно?
tale852150
1
@origaminal Рассматриваемый документ находится по адресу postgresql.org/docs/current/explicit-locking.html , последние четыре - это то, что вы называете «блокировками таблицы» - хотя даже разрешающие блокировки все еще являются формой блокировки таблицы, которая будет предотвращать попытки взятия эксклюзивной блокировки.
SilverbackNet,