Gostaria de saber se a ordem em que os registros são bloqueados é garantida quando uso SELECT ... FOR UPDATE
em cursores ? Por exemplo,
DECLARE
CURSOR test_cursor IS
SELECT field1, field2
FROM table1
ORDER BY pk_field
FOR UPDATE OF field1;
Quando abro esse cursor, ele sempre bloqueia os registros na ordem de pk_field
?
Pelo que li até agora, a ordem de bloqueio não é garantida para regular SELECT ... ORDER BY pk_field FOR UPDATE
, mas não tenho certeza se é verdade para cursores. Eu esperaria que ele travasse na ordem definida na ORDER BY
cláusula para cursores; no entanto, não consigo encontrar confirmação.
Obrigada.
A ordem na qual as linhas individuais serão bloqueadas é indefinida e certamente não é algo em que você deva confiar, pois dependerá do plano de consulta.
Em geral, eu esperaria que as linhas não fossem bloqueadas em ordem - o otimizador geralmente esperaria que fosse mais eficiente acessar todos os dados desordenados e, em seguida, aplicar o método
ORDER BY
. Se houvesse um índice composto empk_field, field1, field2
, eu poderia ver o otimizador potencialmente escolhendo fazer uma verificação ordenada do índice e, em seguida, bloquear cada linha na tabela, mas isso parece improvável.