Árvore de páginas

Update error - lock required - File (...)

Quando uma aplicação AdvPL tenta realizar uma atribuição, REPLACE ou FieldPut() em qualquer campo de um determinado Alias, e o registro atualmente posicionado não estiver devidamente bloqueado pelo usuário atual para alteração (DBRLock(), MSRLock() e/ou RecLock() ), a aplicação é finalizada com a mensagem de erro abaixo, onde é informado o arquivo a ser atualizado, e a linha do código-fonte onde houve a tentativa de atualização, seguinda da pilha de chamadas:

/*-------------------------------------------------------ERRO THREAD (julio, TEC-AUTOMAN)   28/05/2007   09:52:27Stack :Update error - lock required - File: SX5990 in file C:\advtec9\advpl\advplfile.cpp at line 67 on U_UPDNOLOCK(PENDTST.PRW) 28/05/2007 line : 5812[build:7.00.070518A][environment: advpltests_top_ctree][thread 4000]-------------------------------------------------------*/


Ação corretiva

Deve ser verificado o código-fonte que realiza a alteração do registro, para certificar-se que o registro posicionado para alteração realmente foi bloqueado para alteração. Na grande maioria dos casos, não foi verificado no código-fonte se houve sucesso na tentativa de bloqueio do registro para alteração.

 

Informações adicionais

São boas práticas de programação, sempre ao fazer uma alteração de registro em uma tabela, utilizar ALIAS->CAMPO para fazer a atribuição, ou ainda a função FieldPut(). Não é boa prática fazer a atualização de um campo SEM utilizar o ALIAS.

 

Exemplo

Ao invés de : 

CAMPO := xConteudo


Utilize :

ALIAS->CAMPO := xConteudo


Não utilizar a indireção do alias pode comprometer o comportamento do sistema e/ou ocasionar a ocorrência de erro "Lock Required" em situações específicas, como por exemplo a existência de uma variável de memória dinamicamente declarada no escopo, como uma PRIVATE por exemplo, que tenha o mesmo nome de um campo de uma tabela. Caso a variável seja acessada sem que o alias corrente seja o alias da tabela em questão, será considerada a variável em memória, porém quando o alias corrente for setado com o alias onde existe um campo da base com o mesmo nome da variável de memória, será considerado o alias do banco de dados.

  • Sem rótulos