[firebase-br] Aos interessados: Omelhor Autoincrementosequencial

Anticlei Scheid cleischeid em yahoo.com.br
Qui Abr 6 12:06:22 -03 2006


Existe sim !!!

    Sempre utilizei os GENERATORS para chaves sequenciais e nunca tive 
problemas, mas "fiquei com a pulga atrás da orelha" e decidi fazer um teste.
    Fiz um teste com uma aplicação gerando identificador sequencial 
utilizando o GENERATOR no FB 1.5 com código protegido por blocos try..except 
e try..finally e com o controle da transação. A aplicação gera registros em 
intervalos configuráveis (em milisegundos) utilizando um GENERATOR para a 
chave sequencial.
    Rodei 12 instâncias da aplicação ao mesmo tempo e configurei intervalos 
variados para cada instância entre 500 e 600 milisegundos para que 
ocorressem conflitos.
    Resultado: foram 4321 registros em aproximadamente 8 minutos sem nenhum 
conflito de chave, ou seja, funcionou perfeitamente e com segurança.
    Obs: fiz um teste idêntico utilizando o MAX e é lógico que não deu 
certo. Somente duas instâncias e já deu conflito conforme já tinha falado 
antes.
    Se quiserem os fontes do teste para avaliar basta me pedir.
    E é lógico que se houver alguma falha que invalide meu teste, por favor 
gostaria de ser o primeiro a saber.

Abraço a todos.

----- Original Message ----- 
From: "Eduardo Jedliczka (TeamFB)" <jedyfb em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, April 06, 2006 11:11 AM
Subject: Re: [firebase-br] Aos interessados: Omelhor 
Autoincrementosequencial


Bom, deixa eu por lenha da fogueira...

NÃO EXISTE SOLUÇÃO MÁGICA PARA NÚMEROS ININTERRUPTOS SEQUENCIAIS EM BANCO DE
DADOS RELACIONAIS.

Se você precisa se preocupar em "Sequencias Reais" em Notas Fiscais,
Cheques, e outros documentos deste porte, não adianda usar um
Sequence/Generator (nem no Oracle!!!), e tem que se ter muito sangue frio
para se utilizar "Select Max" em aplicações com mais que meia-dúzia de
operadores simultâneos.

Há paliativos "universais" para se resolver isto, entre eles uma "tabela de
gabarito" contendo (dependendo do caso) os "furos" e códigos ainda não
utilizados na emissão de documentos. Só vale lembrar, que para isto
funcionar, é necessário que esta tabela esteja numa transação "diferente"
(auto-commit, read-commited, with lock), onde só será consultada e alterada,
após o Commit da transação principal.

Também há soluções "exclusivas" do InterBase/FireBird... pode-se utilizar
"eventos" para capturar qual foi o último número de nota/cheque emitido e
assim criar uma sequencia sem falhas.

(Cantu que tal acrescentar este assunto na temática das palestras do 3º FDD
???)

 ======================
Eduardo Jedliczka
Membro do TeamFB - FireBase
Apucarana - PR
======================

----- Original Message ----- 
From: "Andrei Luís" <compuvale.software em gmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Thursday, April 06, 2006 9:17 AM
Subject: Re: [firebase-br] Aos interessados: Omelhor
Autoincrementosequencial


Uma solução que se usava bastante na época do Clipper, era de uma tabela a
parte para guardar a sequência. Ex.:

Tabela     Campo   Sequencia
Clientes    ID            1
Produtos  ID            4
Pedidos   ID             10
...

Acho que saiu na Clube Delphi ou na SQL Magazine uns meses atras uma solução
parecida com essa, o título era algo como: "Campos auto-incremento para
qualquer BD". O colunista usou Firebird para mostrar os exemplos.

[]
Andrei


Em 06/04/06, Luis Asensio - Control/P Sistemas <luis em controlp.com.br>
escreveu:
>
> Boa dia a todos!!!
>
>        Essa semana fiz um teste comparando a eficiencia do auto-incremento
> das duas formas descritas. Uma realizando um MAX na tabela e outra usando
> a
> Generator. O teste foi bem simples: Rodei uma aplicatico no qual me inflou
> uma determinada tabela em 100.000 e inserir um cronometro interno para
> poder
> comparar o tempo. O resultado foi uma diferença de 3:00 min, a mais para o
> Trigger com o MAX. O Generator com muitos registros é mais rápido acima de
> 20.000 registros. Concordo que para um sequencial integro o MAX minimiza o
> problema.
>
>
> Abraços
>
>
> Luis Asensio
> Control/P Sistemas
> Setor de Desenvolvimento
> luis em controlp.com.br
> http://www.controlp.com.br
>
> -----Original Message-----
> From: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br]
> On Behalf Of Listas - VirtualComp
> Sent: quarta-feira, 5 de abril de 2006 18:12
> To: Carlos H. Cantu; FireBase
> Subject: Re: [firebase-br] Aos interessados: Omelhor
> Autoincrementosequencial
>
> CREATE TRIGGER GER_COD_CLIENTES FOR CLIENTES ACTIVE BEFORE INSERT POSITION
> 0
> AS declare variable cod integer; begin  select max(codigo_cli)  from
> clientes  where clientes.empresa_cli = new.empresa_cli  into :cod;  if
> (cod
> is null) then
>     cod = 0;
> new.codigo_cli = cod + 1;
> end
>
>
> com essa trigger eu tenho 3..4 empresas cadastradas cada empresa tem uma
> sequencia clientes e nunca da problema...
>
>
______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
Para editar sua configuração na lista, use o endereço 
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Para consultar mensagens antigas: http://firebase.com.br/pesquisa


-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.385 / Virus Database: 268.3.5/302 - Release Date: 5/4/2006






Mais detalhes sobre a lista de discussão lista