无法理解有关FOR UPDATE行锁的PostgreSQL文档

时间:2017-09-13 03:46:42

标签: sql postgresql

  

当锁定子句出现在子SELECT中时,锁定的行是子查询返回到外部查询的行。这可能涉及比单独检查子查询所建议的更少的行,因为来自外部查询的条件可能用于优化子查询的执行。例如,

     

SELECT * FROM (SELECT * FROM mytable FOR UPDATE) ss WHERE col1 = 5;   将仅锁定具有col1 = 5的行,即使该条件在子查询中不是文本上的。

有人可以帮助我理解句子"这可能涉及的行数少于单独检查子查询所表明的行数,因为来自外部查询的条件可能用于优化子查询的执行&#34 ;

我的理解是"锁定的行是由子查询返回到外部查询的行"所以无论子查询返回(在这种情况下是所有行),那些行必须锁定?为什么只有co1 = 5被锁定

1 个答案:

答案 0 :(得分:1)

如果子查询实际运行,则子查询仅锁定行。

有时PostgreSQL可能会注意到它可以跳过执行外部查询的部分以节省时间,而不会影响查询返回的行。

对于一个过于简单的例子,如果你写

SELECT * FROM my_table WHERE (SELECT ... FROM othertable WHERE ... FOR UPDATE) = 1 AND FALSE;

PostgreSQL可以自由地锁定来自othertable的零行,因为它可以证明跳过子查询的执行不会影响查询的结果。

在文档的示例中,重点是如果存在col1 = 4,col1 = 6等的行,那些行可能不会被锁定,因为PostgreSQL可以检查条件{ {1}}并确定该行在执行子查询之前不匹配。但是推论是,如果PostgreSQL首先决定执行子查询,它们也可以锁定

我强烈建议您将明确的行锁定作为CTE或类似工具的一部分进行,并且完全清楚将要执行的内容以及将要执行的操作。