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.