Sign in to follow this  
Followers 0
Ronaldo Silva

Record Lock com o Postgres

4 posts in this topic

Esse é o código usado nos testes para travamento de registro no Postgres.
A instrução HReadSeekFirst com a diretiva lockWrite
HReadSeekFirst(cobradores,id_cob,TABLE_Cobradores.COL_id_Cob,hLockWrite+hLimitParsing)
Não retornava o código que indica registro travado ( 55P03 ) do Postgres.
Após várias tentativas chegamos a essa instruçào:

sSql is string= "select * from cobradores where id_cob ="+TABLE_Cobradores.COL_id_Cob+" for update nowait;"
sQ is Data Source
SQLTransaction(sqlStart,Quantum_Conection) // abre a transação
IF HExecuteSQLQuery(sQ,Quantum_Conection,hQueryWithoutCorrection,sSql) = False THEN
    Info(HErrorInfo(hErrFullDetails))
    SQLTransaction(sqlRollBack,Quantum_Conection)
    RETURN
ELSE
    
    FOR EACH sQ
        Trace(sQ.nome_cob)
        EDT_Nome = sQ.nome_cob
        RADIO_Situ= sQ.situ_cob
        EDT_Comissao= sQ.comissao_cob
    END
END

Note que a finalização da transação não foi feita, essa terá de ser acionada após um update.
SQLTransaction(sqlRollBack,Quantum_Conection)
Ela só foi chamada quando deu erro.

No projeto de testes, criei um botão de liberação para simular o fechamento da transação.
Com essa solução o update após a alteração, se existir, terá de ser feito com outra query da mesma forma que foi feita a query da select.
Isso anulará as instruções FileToScreen e ScreenToFile.
No projeto eu utilizei a conection do Analysis, mas isso poderá ser feito sem o Analysis.

A imagem mostrando o Lock ( lock de registro Windev + Postgres.png ), está dentro do projeto zipado.

Agradecimentos a todos que de alguma forma contribuíram para essa solução, em especial a Paulo Viana e Nelson da Softcomp.
Qualquer erro encontrado ou uma nova forma que encontraram, agradeceria se reportassem.

Abcs
Ronaldo Silva
 

Record_Lock.rar

Share this post


Link to post
Share on other sites
Citar

Aqui deixo tambem o exemplo so para ficar aqui no forum.

Por Paulo viana sousa - skype 28/10/19
Sempre me questionaram sobre o lock de registro com postgresql
aqui vai uma dica

abrindo a transação com = SQLtransaction
e usando um select com FOR UPDATE
automaticamente os registros serão bloqueados
para liberar simplesmente feche a transação

postei aqui pois sei que muitos tem interesse nesse assunto
fica a dica
lembrando que o FOR UPDATE não é aceito dentro do editor de query´s

 

sComandosql is string=[

select * from pro_orcamento where pro_orc_id=1394 for update;

]

dsQuery is Data Source

SQLTransaction(sqlStart,ConexaoI9producao)

HExecuteSQLQuery(dsQuery,ConexaoI9producao,hQueryWithoutCorrection,sComandosql)



FOR EACH dsQuery

	Trace(dsQuery.pro_orc_id)

END

 

Share this post


Link to post
Share on other sites

Claudio , o problema não é com o postgres, é na forma que se usa a instrução SQL dentro do Windev.
select * from tabela where cod = 1 for update nowait, nowait é muito importante.
Isso porque a instrução HReadSeekFirst com
hLockWrite não traz o código de lock do postgres.
Baixe o projeto que anexei, no code da table tem a instrução da forma correta.

 

1 person likes 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
Sign in to follow this  
Followers 0