caiogarcia

[RESOLVIDO] COMO LIDAR COM CONCORRÊNCIA NOS REGISTROS (POSTGRESQL)

14 posts in this topic

Pessoal, bom dia.

Trabalhando com Windev e Postgresql gostaria de saber se alguém tem algum norte a respeito de concorrência de registros.

No caso vamos supor que eu esteja alterando uma VENDA, e gostaria que nenhuma outra pessoa pudesse entrar ao mesmo tempo que eu pra mexer nessa venda, como proceder, e o que vcs me indicam a estudar e me aprofundar p aprender a prosseguir da maneira correta?    

Grato!

1 person likes this

Share this post


Link to post
Share on other sites
7 horas atrás, Cassiano disse:

Da uma olhada na função SQLLock()

Parece q é o q vc precisa.

Segue link do manual

Vou dar uma olhada brother! Obrigado

Share this post


Link to post
Share on other sites

Tente usar HTransaction, dá um nível de isolamento melhor, o LOCK ainda não vi funcionar com o PostgreSQL, muito embora em caso de registro concorrente existe alguns subterfúgios, como por exemplo marcar o registro com um determinado número logo que lê e carrega o Form, assim sendo quando for abrir tem de verificar se o determinado campo está zerado se não estiver é sinal de que algum outro terminal já está atuando sobre o registro. Importantíssimo é garantir que zera o arquivo assim que concluir o processo.

 

Att

 

1 person likes this

Share this post


Link to post
Share on other sites

E o SQLLock @Mello Junior conforme postei no manual? A PCSOFT pelo q li diz q funciona, vc já chegou a testar?

1 person likes this

Share this post


Link to post
Share on other sites

Já utilizou do SQLLock @Cassiano? To apanhando p usar, pelo visto ele realmente funciona. Porém em fase de testes por aqui ainda rsrsrs

Share this post


Link to post
Share on other sites
15 horas atrás, Mello Junior disse:

Tente usar HTransaction, dá um nível de isolamento melhor, o LOCK ainda não vi funcionar com o PostgreSQL, muito embora em caso de registro concorrente existe alguns subterfúgios, como por exemplo marcar o registro com um determinado número logo que lê e carrega o Form, assim sendo quando for abrir tem de verificar se o determinado campo está zerado se não estiver é sinal de que algum outro terminal já está atuando sobre o registro. Importantíssimo é garantir que zera o arquivo assim que concluir o processo.

 

Att

 

Também vou dar uma boa olhada mestre. Obrigado!

Share this post


Link to post
Share on other sites

Tudo resolvido e funcionando.

Utilizei o SQLLock(codigo_sql) para efetuar o bloqueio do registro. Porém o pulo do gato foi no SQL passado para a função. Coloquei no final da instrução as seguintes sentenças: "FOR UPDATE NOWAIT". O NOWAIT faz com que caso não seja possível efetuar o bloqueio ( sinal que tem alguém já bloqueando o registro ) o sistema não trave e não espere até o registro ser liberado, sendo assim você consegue retornar uma mensagem de erro personalizada para o usuário.

1 person likes this

Share this post


Link to post
Share on other sites

Deixa só eu compreender, você está bloqueando o registro para que o usuário preencha todas as entradas e nesse momento está bloqueando todas as transações do sistema? E se o usuário, aquela pessoa que sempre faz tudo conforme o recomendado, resolver ir tomar um café e lá tiver um AVC, para a empresa?

[]´s

 

1 person likes this

Share this post


Link to post
Share on other sites
1 hour ago, Mello Junior said:

 resolver ir tomar um café e lá tiver um AVC, para a empresa?

rsrsrsrsrs

Share this post


Link to post
Share on other sites

Posted (edited)

Creio que não, só faço o block na transação que remete ao registro que foi selecionado. Ao menos nos testes é só isso que está acontecendo. 

Deixei o código da função que fiz abaixo. Sou um mero aprendiz hahaha, mas me parece estar funcionando corretamente.

Não me assuste Mello kkk, mas se tiver alguma consideração que vá ajudar manda bala! Abraço.

 

block.png

Edited by caiogarcia

Share this post


Link to post
Share on other sites

Não entendi a sua ideia de "concorrência". Tenho um cliente A sendo alterado no terminal 1 e outro terminal tem a alteração do mesmo cliente. Então os dois leram o endereço antigo, o primeiro terminal vai e altera para um novo endereço e o terminal 2 não vai ter refletida as alterações do terminal 1 em sua tela. Isso é concorrência de Leitura. Diferente de uma transação que quando toda a operação estiver pronta, você abre a transação, processa tudo e libera novamente os arquivo, se alguma coisa der errado todas as informações serão preservadas da maneira como estavam anteriormente. O CLARION tinha um comando muito útil denominado REREAD e automaticamente antes de gravar ele faz um reread e comparava com as informações originais e se estivessem diferentes, abordava o processo avisando que outro usuário alterou aquele registro.

A leitura concorrente é para IMPEDIR que haja uma alteração na tabela enquanto outro terminal já esteja alterando. Então, pode-se ter um campo string denominado usuario e escrever ali o nome do usuário que entrou para completar a tarefa. Se o outro terminal tentar ler o mesmo terminal (para alteração do cadastro) e visualizar que o campo está preenchido, o programa avisará que o registro está sendo alterado pelo usuário tal. e quando o primeiro usuário concluir a operação, o programa deve limpar a coluna usuário, deixando assim para que qualquer outro terminal possa acessar aquele registro livremente.

[]´s

Share this post


Link to post
Share on other sites
1 hour ago, Mello Junior said:

A leitura concorrente é para IMPEDIR que haja uma alteração na tabela enquanto outro terminal já esteja alterando. Então, pode-se ter um campo string denominado usuario e escrever ali o nome do usuário que entrou para completar a tarefa. Se o outro terminal tentar ler o mesmo terminal (para alteração do cadastro) e visualizar que o campo está preenchido, o programa avisará que o registro está sendo alterado pelo usuário tal. e quando o primeiro usuário concluir a operação, o programa deve limpar a coluna usuário, deixando assim para que qualquer outro terminal possa acessar aquele registro livremente.

Mas isso TAMBÉM esbarra no mesmo problema que vc mencionou na msg anterior: E se o usuário que marcou la que está fazendo a alteração naquele registro, sair, for tomá um café e tiver um AVC? ninguém nunca mais poderá alterar aquele registro?

Janio

Share this post


Link to post
Share on other sites

Posted (edited)

Não, pois no Fechamento da Window, você força a atualização do Registro. A sutil diferença está na identificação do autor da operação, logo todos tomarão muito mais cuidado com essa rotina.

 

Edited by Mello Junior
2 people like this

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now