Interbase em rede

Delphi

16/11/2004

Tenho um cadastro de requsiciao o campo idrequisicao que é mostrado neste form, como o codigo

No meu botao incluir vou um select max(idrequisicao) e gravo este codigo,

ate ai tudo bem, esta fazendo correto,

Mas acontece quando a estacao 1 e a estacao 2 da rede se conecta ao mesmo tempo, é dado erro
de primary key pois o codigo esta errado.

Obs. Nao posso usar o generator do banco, pois se a o generator esta no nro 1000, e se
o usuario incluir um novo registro ira para 1001, ate ai blz, o usuario exclui o 1001, e
vai incluir mais um novo registro o generator ira para 1002, sendo que nao posso perder
essa numeracao (No caso 1001)




Como eu posso resolver isso


Evandro_araujo

Evandro_araujo

Curtidas 0

Respostas

Bruno_fantin

Bruno_fantin

16/11/2004

Você tem que fazer essa consulta no momento que o usuario aperta o botão salvar e mesmo assim fazer ela dentro de transação...


GOSTEI 0
Gandalf.nho

Gandalf.nho

16/11/2004

Você tem que fazer essa consulta no momento que o usuario aperta o botão salvar e mesmo assim fazer ela dentro de transação...


E mesmo assim não é garantido, pq outro pode acessar a tabela durante a transação e pegar o mesmo valor. A menos que você faça um tratamento de erro para incrementar o valor até achar um valor não duplicado. Infelizmente, generator é a única opção não problemática.
Mas pq você não pode perder a numeração? É pra auditoria ou coisa parecida?


GOSTEI 0
Bruno_fantin

Bruno_fantin

16/11/2004

Logico que é garantido... Acessa a tabela em modo exclusivo... Enquanto você não der commit ou rollback a tabela fica indisponivel para qualquer coisa...


GOSTEI 0
Gandalf.nho

Gandalf.nho

16/11/2004

Mas num ambiente multi-usuário não é uma prática muito boa...


GOSTEI 0
Bruno_fantin

Bruno_fantin

16/11/2004

Garanto que é....

Ajudei a fazer um sistema que usava essa forma numa tabela que por dia recebia 20 mil novos registros (alguns manuais e outros de forma eletronica)...

E nunca deu nenhum problema e também nunca deixou a tabela travada tempo suficiente para causar timeout...


GOSTEI 0
POSTAR