4D v16.3Record Locking |
||
|
4D v16.3
Record Locking
Record Locking
4D e 4D Server administram automaticamente os banco de dados evitando conflitos entre processos ou entre usuários. Dois usuários ou dois processos não podem modificar o mesmo registro ou objeto ao mesmo tempo. Entretanto, o segundo usuário ou processo pode acessar simultaneamente ao registro em modo apenas leitura. Há muitas razões para utilizar os comandos multi-usuário:
Nas seguintes seções, como convenção, a pessoa que realiza uma operação no banco de dados multi-usuários é o usuário local. As outras pessoas que otimizam o banco de dados são os outros usuários. A discussão é desde o ponto de vista do usuário local. Da mesma forma, desde o ponto de vista multi-processo, o processo executando uma operação no banco de dados é o processo atual. Qualquer outro processo em curso de execução é referenciado como sendo outro processo. A discussão é desde o ponto de vista do processo atual. Um registro bloqueado não pode ser modificado pelo usuário local ou o processo atual. Um registro bloqueado pode ser carregado, mas não modificado. Um registro é bloqueado quando um dos outros usuários ou processos carrega o registro para realizar uma modificação ou quando o registro está empilhado. Apenas o usuário que modifica o registro vê o registro como desbloqueado. Todos os outros usuários e processos vem o registro como bloqueado e portanto não disponível para modificação. Uma tabela deve estar em modo leitura/escrita para que um registro seja carregado como desbloqueado. Cada tabela de um banco de dados está em modo leitura/escrita ou em modo só leitura para cada usuário e processo do banco de dados. Apenas leitura significa que os registros da tabela podem ser carregados mas não modificados. Leitura/escrita significa que os registros da tabela podem ser carregados e modificados se nenhum outro usuário/processo tenha bloqueado o registro previamente. Note que se muda o estado de uma tabela, a mudança é realizada para o próximo registro carregado. Se já houver um registro carregado quando muda o estado da tabela, o registro não é afetado pela mudança de estado. Quando uma tabela está em modo só leitura e um registro é carregado, o registro está sempre bloqueado. Em outras palavras, o registro pode ser mostrado, impresso e utilizado, mas não modificado. 4D define automaticamente uma tabela em modo só leitura para os comandos que não precisam de acesso de escrita aos registros. Estes comandos são: DISPLAY SELECTION, DISTINCT VALUES, EXPORT DIF, EXPORT SYLK, EXPORT TEXT, _o_GRAPH TABLE, PRINT SELECTION, PRINT LABEL, QR REPORT, SELECTION TO ARRAY, SELECTION RANGE TO ARRAY. Pode saber em qualquer momento o estado de uma tabela utilizando a função Read only state. Quando uma tabela está em leitura/escrita e se carrega um registro, o registro estará desbloqueado se nenhum outro usuário tiver bloqueado o registro primeiro. Se o registro está bloqueado por outro usuário, o registro é carregado como um registro bloqueado que não pode ser modificado pelo usuário local. Uma tabela deve estar em modo leitura/escrita e o registro carregado para que seja desbloqueada e portanto modificável. Pode utilizar os comandos READ ONLY e READ WRITE para mudar o estado de uma tabela. Se deseja mudar o estado de uma tabela para voltar um registro de apenas leitura ou leitura/escrita, pode executar o comando antes de carregar o registro. Todo registro já carregado não é afetado pelos comandos READ ONLY e READ WRITE Cada processo tem seu próprio estado (só leitura ou leitura/escrita) para cada tabela no banco de dados. Como padrão, se não usar o comando READ ONLY, todas as tabelas estão em modo leitura/escrita. Para que o usuário local possa modificar um registro, a tabela deve estar em modo leitura/escrita e o registro deve ser carregado e desbloqueado. Se uma tabela está em modo leitura unicamente, para um processo ou usuário, todo registro carregado desta tabela está bloqueado. Um registro bloqueado não pode sermodificado ou apagado pelo processo ou usuário. O modo apenas leitura é o modo recomendado para a visualização ou recuperação de dados, já que não proibe que outros usuários ou processos acessem os dados em modo leitura/escrita se necessário. Quando termine as modificações a um registro, o registro deve ser liberado (e portanto desbloqueado para os outros usuários) com UNLOAD RECORD. Se um registro não é liberado, ele permanecerá bloqueado para os outros usuários até que um novo registro atual seja selecionado. Mudar o registro atual de uma tabela desbloqueia automaticamente o registro atual anterior. Deve chamar explicitamente a UNLOAD RECORD se não mudar o registro atual. Este princípio aplica aos registros existentes. Quando um novo registro é criado, pode ser guardado sem importar o estado da tabela a qual pertence. Nota: quando se utiliza em uma transação, o comando UNLOAD RECORD descarrega o registro atual só para o processo que administra a transação. Para os outros processos, o registro permanece bloqueado até que a transação não seja confirmada (ou cancelada). Nota: uma boa prática é colocar todas as tabelas em modo de apenas leitura quando se inicia cada processo (utilizando a sintaxe READ ONLY(*)) abaixo, se põe cada tabela em modo leitura/escrita só quando seja necessário.O acesso às tabelas em modo de apenas leitura é mais rápido e poupa mais memória. Por outro lado, mudando o estado de uma tabela se otimiza em modo cliente/servidor, ja que não causa nenhum tráfego de rede adicional: a informação só se envia ao servidor quando for executado um comando que requeira um acesso adequado a tabela. O seguinte exemplo mostra o loop mais simples para carregar um registro não bloqueado: READ WRITE([Clientes]) ` Define o estado da tabela em modo leitura/escritura O loop continua até que o registro seja desbloqueado. Um loop como este se utiliza unicamente quando é pouco provável que o registro esteja bloqueado por outra pessoa, já que o usuário teria que esperar até que o loop termine. Este loop não se utiliza a menos que o registro só seja modificado por um método. O seguinte exemplo utiliza o loop anterior para carregar um registro desbloqueado e modificar o registro: READ WRITE([Inventario]) O comando MODIFY RECORD notifica automaticamente ao usuário se um registro estiver bloqueado e evita que o registro seja modificado. O seguinte exemplo evita esta notificação automática testando o registro primeiro com a função Locked. Se o registro estiver bloqueado, o usuário pode cancelar. Este exemplo prova eficientemente se o registro atual está bloqueado para a tabela [Comandos]. Se estiver bloqueado, o processo é atrasado pelo método por um segundo. Esta técnica pode ser utilizada em um desenvolvimento multi-usuário ou multi-processo: Repeat
Certos comandos da linguagem realizam ações particulares quando encontram um registro bloqueado.
Ver também
LOAD RECORD
|
PROPRIEDADES
Produto: 4D
HISTÓRIA
ARTICLE USAGE
Manual de linguagem 4D ( 4D v16) |