我想知道SELECT ... FOR UPDATE
在游标中使用时是否保证记录的锁定顺序?例如,
DECLARE
CURSOR test_cursor IS
SELECT field1, field2
FROM table1
ORDER BY pk_field
FOR UPDATE OF field1;
当我打开这样的游标时,它是否总是按顺序锁定记录pk_field
?
从我目前读到的内容来看,常规的锁定顺序不能保证SELECT ... ORDER BY pk_field FOR UPDATE
,但我不确定游标是否正确。我希望它确实锁定了ORDER BY
游标子句中设置的顺序;但是,我找不到确认。
谢谢你。
锁定单个行的顺序是未定义的,当然也不应该依赖它,因为它取决于查询计划。
一般来说,我希望这些行不会按顺序锁定——优化器通常会希望访问所有无序数据更有效,然后应用
ORDER BY
. 如果 有一个复合索引pk_field, field1, field2
,我可以看到优化器可能选择对索引进行有序扫描,然后锁定表中的每一行,但这似乎不太可能。