Sequências
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
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
Curtidas 0
Respostas
Gandalf.nho
14/12/2004
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.
GOSTEI 0
Michaell
14/12/2004
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
GOSTEI 0
Gandalf.nho
14/12/2004
É 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.
GOSTEI 0
Michaell
14/12/2004
É 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?
GOSTEI 0
Gandalf.nho
14/12/2004
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.
GOSTEI 0