Sequências

14/12/2004

0

Colegas,

Atualmente, trabalho com Generators para controlar minha sequencias no Banco de Dados. Utilizo as triggers no evento Before Insert e a função GEN_ID() para realizar o incremento do Generator. Beleza...
Problema: Os Generator são do tipo INTEGER, ou seja, suportam 123456789 dígitos, no máximo. Convenhamos que para sequência é muito pouco.
Tive a idéia de criar uma tabela:

SEQUENCIA( NOME VARCHAR(45), VALOR_ATUAL NUMERIC(18) )

E através desta tabela controlarei minha sequências (Agora com o dobro de dígitos para armazenamento com o NUMERIC(18)).

Surgem as dúvidas:

1) Como controlar o incremento dos valores para cada sequência? (Criei uma procedure SEQUENCIA, que recebe como parâmetros o nome da sequência e o valor de incremento; dentro dela dou um UPDATE na tabela de SEQUENCIA, no VALOR_ATUAL da respectiva SEQUENCIA. Desta maneira eu terei algum problema caso, ocasionalmente, ocorra de dois clientes atualizarem a mesma sequência ao mesmo tempo? O Interbase 7.1 controla as transações automaticamente nas procedures e triggers?)

[]´s


Michaell

Michaell

Responder

Posts

14/12/2004

Gandalf.nho

Não sei quanto ao IB 7.1, mas o no FB 1.5 o generator não é Integer, e sim BigInt, que é bem maior.


Responder

15/12/2004

Michaell

Não sei quanto ao IB 7.1, mas o no FB 1.5 o generator não é Integer, e sim BigInt, que é bem maior.


Desculpe-me, mas creio que não foi esta a minha pergunta...

Tive a idéia de criar uma tabela: 

SEQUENCIA( NOME VARCHAR(45), VALOR_ATUAL NUMERIC(18) ) 

E através desta tabela controlarei minha sequências (Agora com o dobro de dígitos para armazenamento com o NUMERIC(18)). 

Surgem as dúvidas: 

1) Como controlar o incremento dos valores para cada sequência? (Criei uma procedure SEQUENCIA, que recebe como parâmetros o nome da sequência e o valor de incremento; dentro dela dou um UPDATE na tabela de SEQUENCIA, no VALOR_ATUAL da respectiva SEQUENCIA. Desta maneira eu terei algum problema caso, ocasionalmente, ocorra de dois clientes atualizarem a mesma sequência ao mesmo tempo? O Interbase 7.1 controla as transações automaticamente nas procedures e triggers?) 

[]´s



Responder

15/12/2004

Gandalf.nho

É que eu falei isso pq você disse que implementou essa solução devido ao pequeno tamanho do generator. Quanto a sua pergunta, sim, pode haver problemas. Há o risco de 2 ou mais usuários pegarem o mesmo número ao mesmo tempo. E sim, as transações são controladas da mesma maneira que em cláusulas SQLs comuns (ao contrário dos generators, quer ficam de fora do contexto das transações), ou seja, se der rollback, a alteração é desfeita.


Responder

15/12/2004

Michaell

É que eu falei isso pq você disse que implementou essa solução devido ao pequeno tamanho do generator. Quanto a sua pergunta, sim, pode haver problemas. Há o risco de 2 ou mais usuários pegarem o mesmo número ao mesmo tempo. E sim, as transações são controladas da mesma maneira que em cláusulas SQLs comuns (ao contrário dos generators, quer ficam de fora do contexto das transações), ou seja, se der rollback, a alteração é desfeita.


Beleza... Mas o meu problema está no controle desta transação... Por exemplo:

Possuo a tabela:

REGISTROS(CODIGO INTEGER NOT NULL, NOME VARCHAR(50) NOT NULL)

Esta tabela possui como chave primária o campo CODIGO, e como índice UNIQUE o campo NOME.

Hipoteticamente duas máquinas clientes irão cadastrar um mesmo registro (´REGISTRO1´) na tabela. Atualmente na tabela SEQUENCIA eu tenho:

NOME VALOR ATUAL

REGISTRO 5

No Delphi 7 estou utilizando DBExpress e DBControls, então iniciei uma transação em um procedimento para retornar o valor da sequência. Problema: As duas máquinas estão acessando ao mesmo tempo o registro de SEQUENCIA para incrementar o valor... E tem mais uma... Tentando inserir em um índice único o mesmo ´nome´.

Como resolver esse problema?


Responder

15/12/2004

Gandalf.nho

No Delphi 7 estou utilizando DBExpress e DBControls, então iniciei uma transação em um procedimento para retornar o valor da sequência. Problema: As duas máquinas estão acessando ao mesmo tempo o registro de SEQUENCIA para incrementar o valor... E tem mais uma... Tentando inserir em um índice único o mesmo ´nome´. Como resolver esse problema?

No caso do primeiro problema, a única maneira de resolver seria interceptar a chave duplicada e incrementar novamente uma delas até conseguir um valor único (é o lado negativo de não usar generator). No caso da chave única, o sistema não tem como saber se a chave é duplicada até os dois postarem suas alterações, principalmente se estiver usando ClientDataSet, em que a comparação só ocorrerá na hora do ApplyUpdates.


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar