Como travar um registro no Interbase?
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]
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
Curtidas 0
Respostas
Sremulador
13/04/2004
Amigo enquanto você estiver em uma transação aberta o registro ficará em lock.
GOSTEI 0
Wellingtongpimenta
13/04/2004
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
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
GOSTEI 0
Beppe
13/04/2004
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.
GOSTEI 0
Afarias
13/04/2004
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:
T+
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+
GOSTEI 0