Algoritimo p/ fornecer numeros sequenciais
05/07/2010 00:00
0
Boa tarde pessoal,

estou precisando implementar um algoritimo p/ fornecer numeros sequenciais, por exemplo:
tenho uma tabela pedidos com um campo id que recebe o valor automaticamente pelo Grails,
e outro campo 'numeroNotaFiscal' que preciso atualizar com o proximo valor conforme a
minha regra de negocio.
Sei que existem varias maneiras, queria saber se existe uma maneira ideal para fazer em Grails?


[]s
Evandro Kumasaka
Tags: Tópicos avançados


0
Opa,

ai a gente começa a ver o problema do paralelismo né? No caso, você precisa garantir que a fonte do seu número sequencial seja o mais isolada possível, ou seja, que apenas um componente do seu sistema seja o responsável por atualizá-lo quando necessário.

No caso do Grails, é possível fazer isto pelo framework sim, mas não te garante segurança alguma, porque imagine que de repente, em um futuro distante mais de uma aplicação precise gerar o mesmo número sequencial. Podem haver problemas.

Minha sugestão neste caso é que você não implemente isto nem em Grails nem em nenhuma outra linguagem, mas sim como um trigger do próprio banco de dados e deixe esta responsabilidade APENAS para o SGBD. Assim, não há como duas aplicações concorrentes se atrapalharem.

Ai, o que você deveria fazer é o seguinte: visto que o código da sua nota usa este sequencial, inclua um evento após a persistência da sua entidade que busque apenas o valor deste campo caso queira aproveitar a mesma instância que acabou de criar. Caso não seja o caso, na próxima consulta do BD já vai ser criada uma nova instância com o campo devidamente preechido pra você.


0
Legal,

costumo fazer usando trigger no banco, crio uma sequence e a função disparada pega o próximo da
sequence e ela já fica atualizada.
Mas não sendo o caso de aplicações concorrentes, como u poderia através do Grails apenas pegar
o proximo vamor de uma sequence?

Vlw!

Evandro
06/07/2010 00:00


0
Só pelo Grails mesmo o que eu faria seria a criação de um método que chamasse pra mim (DENTRO DE UMA TRANSAÇÃO <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) --> ) o maior valor do campo autonumerado antes de persistir a entidade, o incrementaria e em seguida o enviaria para o BD.

No caso, eu também faria um lock na tabela pra evitar o acesso concorrente. Mas não recomendo de modo algum cara. Porque se der merda, sua tabela fica trancada pros demais processos também, saca?



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto