Jump to content


Photo

Lock Ao Executar Uma Função


  • Faça o login para participar
1 reply to this topic

#1 fabiapo

fabiapo

    Turista

  • Usuários
  • 25 posts
  • Sexo:Não informado

Posted 15/01/2010, 09:03

Pessoal,

Estou desenvolvendo um sistema de workflow onde o usuário ao clicar em um botão, eu já passo o número do acionamento para o atendente e repasso para a próxima página em PHP.

Minha dúvida é: Foi desenvolvida uma tabela com apenas um campo com o número do acionamento que deve ser incremental. Fiz uma função onde leio a tabela com o número e faço um upload em seguida somando 1 neste campo. PERGUNTA: Pode existir de mais de um acionamento chamar a mesma função e dar problemas com este numeração? Existe alguma forma de "lockar" este registro enquanto a função não for concluída ou o POSTGRESQL já faz isto? Pois tenho receio de ter mais de uma chamada à função simultaneamente e na leitura o banco passar o número do registro para mais de um acionamento.

Obrigada!

#2 Celão

Celão

    Marcelo Santino

  • Usuários
  • 525 posts
  • Sexo:Masculino
  • Localidade:Rio de Janeiro

Posted 15/01/2010, 13:42

Pessoal,

Estou desenvolvendo um sistema de workflow onde o usuário ao clicar em um botão, eu já passo o número do acionamento para o atendente e repasso para a próxima página em PHP.

Minha dúvida é: Foi desenvolvida uma tabela com apenas um campo com o número do acionamento que deve ser incremental. Fiz uma função onde leio a tabela com o número e faço um upload em seguida somando 1 neste campo. PERGUNTA: Pode existir de mais de um acionamento chamar a mesma função e dar problemas com este numeração? Existe alguma forma de "lockar" este registro enquanto a função não for concluída ou o POSTGRESQL já faz isto? Pois tenho receio de ter mais de uma chamada à função simultaneamente e na leitura o banco passar o número do registro para mais de um acionamento.

Obrigada!


Você criou uma tabela com um único campo só pra isso? Nesse caso, porque você não utiliza um campo tipo serial e para cada nova interação você faz um insert e pega esse número inserido? Tipo, você pode criar um novo campo nessa sua tabela do tipo timestamp pra definir o momento da criação desse registro (apenas informativo):

Tabela: atendimento
Campos: id_atendimento (serial), data (timestamp)

E na hora do novo atendimento ficaria assim:
INSERT INTO atendimento (data_cadastro) values ( now() ) returning id_atendimento

Assim, quando preencher o campo data, automaticamente a sequence vai incrementar o campo id_atendimento (por ser serial) e vai retorna-lo como resultado do seu insert.

Dessa forma é garantido que cada atendimento terá seu próprio ID único, sem problema de concorrência.

Edição feita por: Celão, 15/01/2010, 13:42.

Marcelo Santino - DBA SQL Server/Oracle
Banco de dados e Tecnologia: www.bau-de-dev.com




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq