[firebase-br] Pegar Código

Tecnobyte Informática temp2 em tecnobyte.com.br
Dom Jul 29 19:04:52 -03 2012


Oi Renato

O que você disse é verdade, porém a hipótese que apresentei é verdadeira.

Note que cada cliente receberá sim um código diferente (500 e 501):

> USUÁRIO1: INSERT INTO Cliente ... (gerou código 500)
> USUÁRIO2: INSERT INTO Cliente ... (gerou código 501)

Mas nesta chamada abaixo sempre vai retornar o valor atual do generator, que 
logo após os dois comandos acima será 501. Observe que o segundo parâmetro 
que estou passando para GEN_ID é zero, de modo que o generator não será 
incrementado, fazendo com que retorne sempre o mesmo valor nas duas 
chamadas.

> USUÁRIO1: SELECT GEN_ID(Gen_Cliente_Codigo, 0) ... (pegou 501)
> USUÁRIO2: SELECT GEN_ID(Gen_Cliente_Codigo, 0) ... (pegou 501)

Inclusive é fácil criar uma situação como esta pare fazer testes, bastando 
colocar MessageBox/ShowMessage após chamar cada comando e executar a 
aplicação de testes duas vezes e seguir a sequência que mencionei.

Atenciosamente.

Daniel P. Guimarães
Tecnobyte Informática
www.tecnobyte.com.br

-----Mensagem Original----- 
From: renato wulf jr
Sent: Saturday, July 28, 2012 6:07 PM
To: FireBase
Subject: Re: [firebase-br] Pegar Código

Daniel,

Não é assim que o engine do Firebird se comporta no caso dos generators.
Eles estão em um processo ou nível separado das transações que estão
abertas no momento.

Independente de quantos usuários há no sistema e, também não importa o
espaço de tempo entre uma requisição e outra ao generators, ele nunca fará
com que dois ou mais usuários peguem um mesmo número. Isso consta no
material do Firebird.

O que já vi muitos fazerem, é criar uma tabela contendo o último código
gerado. Esse sim, dependendo da transação pode gerar duplicidade. Seria
reinventar a roda.


Renato


Em 27 de julho de 2012 21:53, Tecnobyte Informática
<temp2 em tecnobyte.com.br>escreveu:

> Boa noite Levy
>
> Eu entendi a preocupação do Saulo e ele realmente tem razão em se
> preocupar com isto. Embora possa ser pequena a probabilidade de inserir
> dois registros na mesma tabela em uma fração de segundo, no dia em que
> isto
> acontecer poderá gerar problema, que dependendo da lógica do sistema pode
> ser um grande problema.
>
> Veja uma hipótese do que pode acontecer:
>
> USUÁRIO1: INSERT INTO Cliente ... (gerou código 500)
> USUÁRIO2: INSERT INTO Cliente ... (gerou código 501)
> USUÁRIO1: SELECT GEN_ID(Gen_Cliente_Codigo, 0) ... (pegou 501)
> USUÁRIO2: SELECT GEN_ID(Gen_Cliente_Codigo, 0) ... (pegou 501)
> USUÁRIO1: INSERT INTO ContaReceber... (grava conta a receber para o
> cliente 501, mas deveria ser do cliente 500)
> USUÁRIO2: INSERT INTO ContaReceber... (grava conta a receber para o
> cliente 051, o que é correto para USUÁRIO2)
>
> No final, foram gravadas duas contas a receber para o cliente 501, quando
> o correto seria uma conta a receber para cada cliente.
>
>
> Atenciosamente.
>
> Daniel P. Guimarães
> Tecnobyte Informática
> www.tecnobyte.com.br
>
> 





Mais detalhes sobre a lista de discussão lista