SELECT / 删除并发场景 - Postgres

SELECT / DELETE concurrent scenario - Postgres

我知道 SELECT 在 Postgres 中不需要行锁。因此,我可以从连接 1 中的某些 table T 发出 SELECT,然后其他人可以发出 DELETE(在同一 table [ 中的所有行中) =13=]) 在连接 2 中,并且 DELETE 不会导致任何阻塞。对吗?

此处描述:

好的...我的问题是:此行为是否取决于在两个连接中的任何一个中使用的 ISOLATION LEVEL

我为什么要问这些?

在现实世界中,我们有类似的并发场景(如上),但 SELECTTRUNCATE TABLE 不同。并且我们有一个阻塞问题,因为 TRUNCATE TABLE(不像 DELETE * FROM TABLE)需要独占 table 锁(当 SELECT 是 运行 时它无法获得)。所以我们正在考虑使用 DELETE * 而不是 TRUNCATE(尽管 DELETE 稍微慢一些)来解决这个阻塞问题。

无论您使用何种隔离级别(REPEATABLE READ 或更高级别,您的解决方案都将起作用(当然,您可能会遇到序列化错误,但这无关紧要)。

但是,TRUNCATE 会更有效率。如果您在使用锁时遇到问题,则表明您有使用 table 的长期 运行 事务。尽量避免这种情况,因为长事务通常是有问题的。