[firebase-br] Pegar Código

renato wulf jr renatus em centris.com.br
Sáb Jul 28 19:07:12 -03 2012


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