[firebase-br] AutoIncremento
Nilton Souza
ntn em bbs2.sul.com.br
Seg Out 4 16:05:06 -03 2004
Olá Evandro,
Eu uso os generators em tabelas onde não existe nenhum problema em perder a
numeração e quando existe a necessidade de manter a sequência da numeração
eu utilizo uma tabela de controle a qual submeto ao contexto transacional,
assim ela irá ficar em "lock" até que seja efetuado um commit ou rollback
evitando que outro usuário pegue o mesmo número. Porém tome cuidado com isso
pois você pode facilmente gerar queda de performance ou até deadlock's,
sugiro que você reduza ao máximo o tempo de vida de suas transações.
A estrutura da minha tabela de controle é mais ou menos assim:
CREATE TABLE Tabelas (
Nome VARCHAR(30) NOT NULL,
ProximoId INT DEFAULT 1 NOT NULL
);
ALTER TABLE Tabelas ADD Primary Key PK_Tabelas (Nome);
Então eu tenho uma SP chamada sp_proximo_id com essa estrutura:
set term !! ;
create or alter procedure sp_proximo_id(TabNome varchar(30))
returns(Id integer)
as
begin
select ProximoId
from TABELAS
where upper(Nome) = upper(:TabNome)
into :Id ;
if (:Id is not null and :Id > 0) then
begin
update TABELAS
set ProximoId = ProximoId + 1
where upper(Nome) = upper(:TabNome);
end
else
Id = -1;
suspend; /* USE O SUSPEND SE VC QUISER PEGAR O ID ATRAVÉS DE SELECT's */
end !!
set term ; !!
Exemplo de utilização:
SQLConnection.StartTransaction(TransDesc);
>> Executa SP sp_proximo_id e pega o ID
(observe que a chamada é feita dentro do escopo transacional)
>> Inclui o cliente
SQLConnection.Commit(TransDesc);
[]'s
Nilton Souza
----- Original Message -----
From: "Evandro Bastiani" <evandrobastiani2 em hotmail.com>
To: "FireBase" <lista em firebase.com.br>
Sent: Monday, October 04, 2004 3:38 PM
Subject: [firebase-br] AutoIncremento
Até agora, depois de ver tantas opiniões não cheguei a uma conclusão de qual
forma melhor de se fazer um numero autoincremental.
Gerar manualmente acrescentando mais 1 a variavel não me agradou pelo fato
de correr um grande risco de 2 usuarios inserir na mesma hora.
Trigger no After insert tem um problema, que é a perda do Numero caso
desfaça a operação de inclusão.
O correto seria um generator Before Post, só que como vou conseguir
gerenciar o gatilho no Post somente quando for Inclusão, e não para
alteração?
Idéias serão bem-vindas!!!
______________________________________________
FireBase-BR (www.firebase.com.br)
Para editar sua configuração na lista, use o endereço
http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
Mais detalhes sobre a lista de discussão lista