Fórum Como travar um registro no Interbase? #43699

13/04/2004

0

Olá Pessoal!
Estou com a seguite dúvida:

Tenho uma tabela de notas fiscais, e a mesma pode ser acessada por n usuarios.
mostro todos os registros em uma pesquisa para os usuarios ´A´ e ´B´.

O usuario ´A´ quer trabalhar a NF nro 10, e pega o registro para trabalhar.
No Oracle eu uso
Código:

SELECT * FROM TB_NF WHERE NOTA = 10 FOR UPDATE NO WAIT


para travar o registro para o usuario ´A´.

O usuario ´´B´ quer trabalhar também a NF nro 10, e tenta pegar o registro para trabalhar, no Oracle eu sei que se o usuario ´A´ está trabalhando com o comando
Código:

SELECT * FROM TB_NF WHERE NOTA = 10 FOR UPDATE NO WAIT



Se eu não conseguir dar um ´Lock´ travar o registro é porque ele esta em uso.

Gostaria se é possível travar apenas um registro para uso no Interbase.

Obs.:
No help do SQL do interbase existe o comando NO WAIT porém pesquisando na net encontrei em algumas apostilas que o IB nao trava os registros.
A maneira mais fácil que conheço é tratando os registros por TAG(marca).
Ex.:
O usuario ´A´ quer trabalhar a NF nro 10, e pega o registro para trabalhar.
Então dou um UPDATE no campo TAG para 1.

O usuario ´´B´ quer trabalhar também a NF nro 10, e tenta pegar o registro para trabalhar.
Então verifico na tabela se a TAG do registro está em 0, se não o mesmo está em uso.
Mas isso é muito usado em Paradox, e acho que um banco legal como o Ib deveria ter esse recurso.

E ai galera algém tem a solução?
Obrigado a todos pela colaboração!!

[color=green:c0b412be13]Movido de Delphi para Interbase/Firebird[/color:c0b412be13]


Jacson

Jacson

Responder

Posts

13/04/2004

Sremulador

Amigo enquanto você estiver em uma transação aberta o registro ficará em lock.


Responder

Gostei + 0

26/09/2005

Wellingtongpimenta

para o caso de dois usuários estarem utilizando o mesmo registro faça

SELECT NRO_NOTA FROM NOTAFISCAL
WHERE NRO_NOTA = (SELECT MAX(NRO_NOTA) FROM NOTAFISCAL)
WITH LOCK

que o registro vai ficar travado até o COMMIT ser executado.

eu sugiro que vc faça um loop para testar se o select abriu... faça um
for e um try.

abraços

wellington


Responder

Gostei + 0

01/10/2005

Beppe

A maneira mais fácil que conheço é tratando os registros por TAG(marca). Ex.: O usuario ´A´ quer trabalhar a NF nro 10, e pega o registro para trabalhar. Então dou um UPDATE no campo TAG para 1. O usuario ´´B´ quer trabalhar também a NF nro 10, e tenta pegar o registro para trabalhar. Então verifico na tabela se a TAG do registro está em 0, se não o mesmo está em uso. Mas isso é muito usado em Paradox, e acho que um banco legal como o Ib deveria ter esse recurso.

Só atente aos detalhes. Se ao abrir a query ambos retornem a TAG como 0, mas antes de dar update a TAG já está como 1? Vc trata este caso no WHERE, com ´and TAG = 0´ e verifique RowsAffected.


Mas isso é muito usado em Paradox, e acho que um banco legal como o Ib deveria ter esse recurso.

O FB tem.


Responder

Gostei + 0

03/10/2005

Afarias

o IB mantem o registro bloquado sempre q há uma alteração no registro. Esse bloqueio permanece até q o usuário q fez a alteração termine sua transação (commit ou rollback) ... ex de lock no IB c/ IBX:


with IBDataSet1 do
begin
  Edit;
  Fields[0].AsInteger := Fields[0].AsInteger; //simula alteração
  Post; // o registro é bloqueado neste momento

  { ... }

  Transaction.Commit; // o registro é liberado aqui
end;



T+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar