Consultor Eletrônico



Kbase 51110: Comandos ORACLE para cada tipo de LOCK do comando ABL FOR EACH
Autor   Eloi Rene Pscheidt - CAT
Acesso   Público
Publicação   19/06/2015
Aqui apresento os comandos DML gerados pelo Dataserver Oracle para cada tipo de LOCK utilizado nos comandos FOR EACH.

FOR EACH <tabela> NO-LOCK
Executa 1 vez: SELECT <todas as colunas> FROM <tabela>

FOR EACH <tabela> EXCLUSIVE-LOCK
Executa 1 vez: SELECT progress_recid from <tabela>
Para cada registro do select anterior: SELECT <todas as colunas> FROM <tabela> WHERE progress_recid = <recid> FOR UPDATE OF <coluna>
Para cada registro alterado: UPDATE <tabela> SET <campo> = <valor> WHERE progress_recid = <recid>

FOR EACH <tabela> SHARE-LOCK
Executa 1 vez: SELECT <todas as colunas> from <tabela>
Para cada registro alterado: SELECT <todas as colunas> FROM <tabela> WHERE progress_recid = <recid> FOR UPDATE OF <coluna> NOWAIT
Para cada registro alterado: UPDATE <tabela> SET <campo> = <valor> WHERE progress_recid = <recid>

Conclusões do ponto de vista de desempenho:
Se você NÃO vai alterar registros, utilize NO-LOCK.
Se for alterar APENAS alguns registros do seu FOR EACH, prefira SHARE-LOCK.
Se for alterar TODOS os registros do seu FOR EACH, tanto faz utilizar SHARE-LOCK ou EXCLUSIVE-LOCK.