Apanhando para Gerar Código

Salve, Salve Galera!

Estou apanhando para gerar um código em cadastro…

Penso que funcione assim:

Iniciar uma Transação
Buscar o valor do último codigo e somar + 1
Fazer um Insert com o novo código

O usuario preenche os campos

Atualizar os campos da tabela com os campos que o usuário preencheu

Commitar a transação

Até ai beleza! ai eu peguei o conceito (errado ou certo, mas peguei rs** )

Só que, se um usuário começar a fazer um cadastro e segundos depois ou outro usuário
começar a fazer um outro cadastro em outra estação o código vai ser o mesmo pois a
transação do primeiro usuário não sofreu o commit ainda, ai terei problemas…

A solução deve ser mais fácil que explicar né? rs***

Alguém pode ajudar?

Valeu!

[quote=“Dennys”]Salve, Salve Galera!

Estou apanhando para gerar um código em cadastro…

Penso que funcione assim:

Iniciar uma Transação
Buscar o valor do último codigo e somar + 1
Fazer um Insert com o novo código

O usuario preenche os campos

Atualizar os campos da tabela com os campos que o usuário preencheu

Commitar a transação

Até ai beleza! ai eu peguei o conceito (errado ou certo, mas peguei rs** )

Só que, se um usuário começar a fazer um cadastro e segundos depois ou outro usuário
começar a fazer um outro cadastro em outra estação o código vai ser o mesmo pois a
transação do primeiro usuário não sofreu o commit ainda, ai terei problemas…

A solução deve ser mais fácil que explicar né? rs***

Alguém pode ajudar?

Valeu![/quote]

Você poderia fazer algo assim… quando um usuário estiver alterando o banco, vc torna a base de dados acessível só para consulta… não sei como fazer isso…

Uma solução simples seria fazer um select… for update na tabela.
Isso irá fazer um lock que só será liberado com o commit ou o rollback.

Vamos por partes:

  1. Talvez a seqüência não a melhor. Não é a solução, mas já ajuda. Ao invés de:

use:
1 - Iniciar a transação
2 - O usuário preenche os campos
3 - Imediatamente antes de executar o Insert você pega o próximo código
4 - Executar o Insert
5 - Commit

Mas a melhor solução para esse tipo de coisa é deixar o banco resolver o problema. Use autoincremento ou sequence. No segundo caso funciona mais ou menos igual, você dá um select na sequence e ela incrementa, assim você já tem o código para mostrtar se precisar e outro usuário não o pega mais.
Dependo do seu banco e do tipo de aplicação que você tá fazendo. Nesse momento estou num cliente que abre os para serviços, é parecido, eu preciso gerar o número da OS, mas só uma pessoa faz isso. Logo não existe essa preocupação.
Se fosse você evitaria lock de tabela e coisas do tipo, o pessoal que gosta de imploementar tudo na mão é que gosta disso. :lol: Mas ainda assim acho que deependa da aplicação.

Hum…

Compreendi…

Obrigado a todos!