Saltar para o conteúdo principal
Versão: Próximo

SET QUERY AND LOCK

SET QUERY AND LOCK ( bloq )

ParâmetroTipoDescrição
bloqBooleano🡒True = bloquear os registros encontrados por pesquisas; False = Não bloquear os registros

Descrição

O comando SET QUERY AND LOCK permite solicitar o bloqueio automático dos registros encontrados por todas as pesquisas que seguem o chamado deste comando na transação atual. Isso significa que os registros não podem ser modificados por um processo diferente ao processo atual entre uma pesquisa e a manipulação de resultados.

Por padrão, os registros encontrados pelas pesquisas não estão bloqueados. Passe True no parâmetro bloq para ativar o bloqueio.

Este comando deve imperativamente ser utilizado no interior de uma transação. Se for chamado fora deste contexto, é gerado um erro. Isso permite um melhor controle do bloqueio de registros. Os registros encontrados permanecerão bloqueados até que a transação termine ( confirmada ou cancelada). Depois que a transação se completa, todos os registros são desbloqueados.

Os registros estão bloqueados para todas as tabelas na transação atual.

Quando uma instrução SET QUERY AND LOCK (True) for executada, os comandos de pesquisa (por exemplo QUERY) adotam um funcionamento específico se for encontrado um registro bloqueado:

- A pesquisa se detém e a variável sistema OK toma o valor 0,
- A seleção atual fica vazia,
- O conjunto sistema LockedSet contém o registro bloqueado que causou que a pesquisa fosse interrompida.

Portanto, neste contexto é necessário testar o conjunto LockedSet definido depois de uma pesquisa infrutífera (seleção atual vazia ou variável OK em 0) para determinar a causa da falha.

Chame SET QUERY AND LOCK(False) com o objetivo de desativar o mecanismo posteriormente.

SET QUERY AND LOCK modifica unicamente o comportamento dos comandos de pesquisa em outras palavras:

Entretanto, SET QUERY AND LOCK não afeta os outros comandos que modificam a seleção atual tais como as ALL RECORDS, RELATE MANY etc.

Exemplo

Neste exemplo, não é possível apagar um cliente que teria sido passado da categoria “C” a categoria “A” em outro processo entre QUERY e DELETE SELECTION:

 START TRANSACTION
 SET QUERY AND LOCK(True)
 QUERY([Clientes];[Clientes]Categoria=“C”)
  //Neste momento, os registros encontrados são bloqueados automaticamente por todos os outros processos
 DELETE SELECTION([Clientes])
 SET QUERY AND LOCK(False)
 VALIDATE TRANSACTION

Gestão de erros

Se o comando não é chamado no contexto de uma transação, um erro é gerado.

Ver também

QUERY