我知道这与其他问题(例如, this one )非常相似,但我觉得我还没有找到一个答案,其中包括查询的 SELECT 部分如何影响锁的具体问题。
具体来说,我有两个表之间的父子关系,通过引用父主键的子表上的外键强制执行。在我正在开发的一个软件中,我想采用“路径”(父键+子键)并仅在子行是有效的“路径”时才返回子行。因此,查询将类似于:
SELECT Child.*
FROM Child
INNER JOIN Parent ON Parent.id = Child.parent_id
WHERE Parent.id = ? AND Child.id = ?
FOR UPDATE
我从我链接的另一个问题中了解到,如果我执行了SELECT *
. 但是当我实际上没有返回任何父行的列时,我不确定这是否会改变。
文档说(强调我的):
对于 SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE,为扫描的行获取锁,并为不符合包含在结果集中的行(例如,如果它们不符合WHERE 子句中给出的标准)。但是,在某些情况下,可能不会立即解锁行,因为结果行与其原始源之间的关系在查询执行期间丢失。
但我可以用多种方式来解释。“有资格”包含在结果集中是什么意思?我没有在我的SELECT
“不合格”中包含任何列的事实吗?还是“限定”仅指JOIN...ON
, WHERE
, 和HAVING
子句?
谢谢!