[firebase-br] Ref. Bloquear registro

Sandro Souza escovadordebits em gmail.com
Ter Dez 2 10:45:55 -03 2008


Bom dia/tarde Omar.

Há uma página no site da IBPhoenix que fala sobre isso:
http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_lock_records

Nessa mesma página tem um link para um PDF com a tradução do texto em
português brasileiro.

Pelo que eu entendi, usando a sintaxe do SELECT com a opção FOR UPDATE WITH
LOCK OPTION no final, faria a trava de registro(s), mas é bom fazer alguns
testes práticos para verificar como a versão do seu Firebird se comporta,
pois ao que parece, houve mudanças a partir do Firebird 1.5, e
provavelmente, pode haver outras mudanças de comportamento em futuras
versões.

Em uma empresa em que trabalhei, eu utilizei uma técnica meio rudimentar,
mas de fácil utilização.

Criei uma tabela com 3 colunas: O nome da tabela com um ou mais registros
bloqueados, uma string (varchar) contendo os valores dos campos chaves
concatenados e separados por ponto-e-vírgula, e o código do usuário que
efetuou aquele bloqueio.

Ou seja, é uma técnica em que depende da aplicação e não do próprio banco de
dados.

Antes de bloquear algum registro, a aplicação executava um SELECT nessa
"tabela de bloqueios", pesquisando pelo nome da tabela e pelos valores dos
campos chaves, para verificar se aquele registro em particular já estava
bloqueado por outro usuário.

Não estando, a aplicação executava INSERT(s) para bloquear o(s) registro(s)
desejado(s).

A rotina de desbloqueio apenas excluia as respectivas linhas/registros da
tabela de bloqueios.

Como Murphy é simplesmente o cara mais eficiente do mundo, poderia ocorrer
alguma situação em que a aplicação tivesse que ser encerrada "na marra", e
isso deixava os bloqueios na tal tabela de bloqueios.

Tive que implementar uma rotina para desbloquear registros de um determinado
usuário (acessível pelo administrador do sistema), assim como a cada
entrada/logon no sistema, a aplicação já excluia todos os bloqueios
efetuados por aquele usuário.

Sei que não é uma boa técnica, mas ficava mais independente dos recursos do
banco de dados, ou seja, futuramente poderia migrar para outro banco de
dados, mesmo que o novo banco de dados não suportasse bloqueios de
registros.

Também dessa forma, facilmente a aplicação poderia informar, ao usuário
atual, qual usuário efetuou o bloqueio daquele determinado registro.

Espero ter ajudado mais que atrapalhado.

2008/12/2 Omar Haddad <omarhaddadm em gmail.com>

> Salve amigos
>
> Estou usando nos meus cadastros, ZTable para manutenções simples. Agora, eu
> queria
> saber como a aplicação/Firebird trata quando o usuário estiver editando um
> registro
> e outra estação pedir para editar o mesmo.
>
> Tem como interceptar isto usando ZTable ?
>
> Vi uma solução usando ZQuery com with lock, mas estou prestes a entregar o
> sistema
> e os cadastros foram feitos usando ZTable. (Zeos)
>
> Se alguém tiver uma orientação / indicação, desde já agradeço
>
> Abraço e sucesso a todos.
>
> Omar  ;)
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista