
Lock Ao Executar Uma Função
#1
Posted 15/01/2010, 09:03
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
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.
1 user(s) are reading this topic
0 membro(s), 1 visitante(s) e 0 membros anônimo(s)