[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