无法理解有关更新行锁的PostgreSQL文档

无法理解有关更新行锁的PostgreSQL文档,sql,postgresql,Sql,Postgresql,当子SELECT中出现锁定子句时,锁定的行是子查询返回到外部查询的行。这可能比单独检查子查询所建议的行少,因为外部查询的条件可能用于优化子查询的执行。比如说, 从mytable中选择*以更新ss,其中col1=5; 将仅锁定col1=5的行,即使该条件不在子查询中 有人能帮我理解这句话吗?因为外部查询的条件可能会被用来优化子查询的执行,所以这可能比单独检查子查询所建议的行要少 我的理解是,被锁定的行是由子查询返回到外部查询的行,所以无论子查询返回什么,在这种情况下,所有行都必须被锁定?为什么只有

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

从mytable中选择*以更新ss,其中col1=5; 将仅锁定col1=5的行,即使该条件不在子查询中

有人能帮我理解这句话吗?因为外部查询的条件可能会被用来优化子查询的执行,所以这可能比单独检查子查询所建议的行要少


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

如果子查询实际运行,子查询只锁定行

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

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

SELECT * FROM my_table WHERE (SELECT ... FROM othertable WHERE ... FOR UPDATE) = 1 AND FALSE;
PostgreSQL可以自由地从othertable锁定零行,因为它可以证明跳过子查询的执行不会影响查询结果

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


我强烈建议您将显式行锁定作为CTE或类似程序的一部分,在这种情况下,将执行什么和不执行什么都非常清楚。

谢谢!我不会想出这种隐式优化,否则我怎么能对行执行显式锁定呢?我不想做这张桌子locking@Zanko你可以这样做,没关系。您只需要了解哪些行被锁定的含义。有时,将CTE与查询一起使用将其拆分为可以控制执行的步骤是很有用的。