Em rotinas de processamento em ambientes multiusuários é comum dois usuários solicitarem o mesmo processamento simultaneamente.
Exemplo: Usuário A e B solicitam a liberação de todos os pedidos em aberto. Nesta situação há duas alternativas:
- Bloquear a rotina para uso Mono-usuário;
- Tratar a concorrência.
O bloqueio da rotina para uso Monousuário deve ser evitado, porém se necessário deve ser feito através do uso de um semáforo. A função LockByName é a mais recomendada para esta finalidade. Porém deve-se atentar o isolamento necessário. Caso a rotina seja multiempresa, deve-se considerar a empresa, caso for multifilial deve-se considerar a filial na formação da chave de isolamento. Exemplo: Para que rotina MATA330 esteja isolada de todas as empresas e filiais, deve-se utilizar o Grupo de Empresas na formação da chave de isolamento LockByName(“MATA330_”+cEmpAnt). Se a necessidade for apenas do isolamento da filial, deve-se utilizar a filial na formação da chave de isolamento LockByName(“MATA330_”+cFilAnt)
Tratar a concorrência em rotinas de processamento é uma tarefa simples, que traz um enorme beneficio para o desempenho da aplicação. Quando dois usuários executam a mesma rotina simultaneamente é muito provável que um dos usuários bloqueie o registro principal e os demais fiquem aguardando a liberação do bloqueio. Após a liberação do bloqueio um dos usuários conseguirá fazer o bloqueio, porém não haverá processamento a ser feito e o próximo registro já estará bloqueado. Como é possível notar, não há beneficio algum para o sistema, mas há o prejuízo de consumo de hardware do Application Server.
Para que o sistema tenha beneficio neste tipo de situação é imprescindível o uso da função SimpleLock. Esta função avalia se o registro pode ser bloqueado e caso não consiga, a rotina passará para o próximo registro e assim sucessivamente até o termino do processamento. A grande vantagem de seu uso é que, quanto mais chamadas o cliente fizer da mesma rotina, mais rápido será o processamento da rotina.
É importante destacar que este processo somente tem benefícios se executado fora de uma transação. Assim, seu beneficio esta associado a rotinas de processamento de filas que bloqueiam um item da fila e iniciam a transação após este bloqueio.
Registros da Tabela | Momento | Chamada 1 | Chamada 2 | Chamada 3 |
10 | 1 | Bloqueia 10 | Bloqueia 11 | Bloqueia 12 |
11 | 2 | Libera 10 | Libera 11 | Libera 12 |
12 | 3 | Encerra | Encerra | Encerra |
Note que este tipo de solução pode ser utilizado em vários tipos de rotina de processamento, desde que haja um ponteiro para execução.