没有WHERE子句的UPDATE是否会锁定PostgreSQL中的表?


9

整个表UPDATE(没有指定WHERE子句)是否在PostgreSQL中锁定了一个表?例如,它是否防止行被删除/插入?

例如,如果运行,是否 UPDATE t1 SET key = 'value' 可以t1UPDATE执行过程中插入新行?

如果否,我UPDATE是否可以期望即使启动后出现的行也会更新?(键DEFAULT 'value'的定义中没有)


如果要更新的行是在开始之后插入的行,并且有一个不断插入行的进程,这是否意味着更新语句将永远无法完成?
乔W

好点子!是的,几乎不可能UPDATE以这种方式来更新新插入的行。
原始

不,只有已更改的行将被锁定。UPDATE永远不会锁定整个表。
a_horse_with_no_name

Answers:


15

没有WHERE子句的UPDATE将锁定表中的所有行,但不会为DML锁定表本身。

由于行已被锁定,因此无法从其他事务中删除它们。

但是您可以插入新行而不会出现问题(假设它们没有违反任何约束)。

UPDATE语句不会看到在UPDATE 之后插入的任何行,因此不会更改它们。


您能否分享文档上的链接。在官方文档中我找不到很多关于UPDATE没有的说法WHERE
原始的

而且由于行锁,从另一个事务更新的行也会失败,对吗?
tale852150

1
@origaminal有问题的文档位于postgresql.org/docs/current/explicit-locking.html,后四个是您所说的“表锁”-尽管即使是许可锁也仍然是表锁的一种形式,防止尝试获取排他锁。
SilverbackNet
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.