[firebase-br] Aos interessados: Omelhor Autoincrementosequencial

Anticlei Scheid cleischeid em yahoo.com.br
Qui Abr 6 10:18:42 -03 2006


Usar uma tabela como essa é a mesma coisa que usar o Generator para cada 
sequencia, ou seja, GenClientesID, GenProdutosID, etc.
Usar Max NÃO é seguro, pois entre as instruções de obter um MAX e inserir um 
registro com o número encontrado existe um tempo x que pode ser ocupado 
concorrentemente por outra instância da mesma aplicação criando um conflito, 
pois dessa forma pode ocorrer de duas instâncias da mesma aplicação gerarem 
o mesmo número, o que vai resultar numa exceção que deverá ser tratada, ao 
contrário do Generator que não tem este problema. Observe:

Instância    Tempo    Instrução    ID
A                1           Max           10    (obtém o número e guarda 
numa variável para usar no insert)
B                2           Max           10    (obtém o número e guarda 
numa variável para usar no insert)
A                3           Insert         10
B                4           Insert         10   ------> erro de chave 
primária

A instância B obteve o Max quase ao mesmo tempo que A e ANTES que ela 
conseguisse efetuar o insert que alteraria uma outra instrução Max. Temos 
que lembrar também, que existem as proteções de Transactions e temos os 
tempos de Commit, que eu desprezei no exemplo acima.

Façam uma aplicação que fica automaticamente inserindo registros utilizando 
o Max e rode duas instâncias atualizando a mesma tabela e verá o erro 
ocorrer.

Abraço


----- 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


-- 
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