DBRUnlock cannot be called in a transaction
Quando uma aplicação AdvPL chama as funções DBRUnlock e/ou DBUnlock, para soltar um e/ou todos os locks de alteração de registro do Alias atual no processo atual, e a RDD da tabela em questão está com uma transação ativa, o programa será finalizado com a ocorrência de erro fatal AdvPL abaixo:
/*-------------------------------------------------------ERRO THREAD ([5852], juliow, TEC-AUTOQUAD) 22/04/2010 11:00:20 Stack :DBRUnlock cannot be called in a transaction on U_THETRAN(PENDTST.PRW) 22/04/2010 10:59:49 line : 15070[build: 7.00.090818P-20100410][environment: advpltests_top_mssql][thread: 5852]-------------------------------------------------------*/
Ao finalizar o processo, a transação é encerrada realizando rollback.
Ação corretiva
Deve ser verificado o código-fonte que chama a função DBRUnlock e/ou DBUnlock, pois ambas não podem ser chamada em código-fonte com um transação ativa, elas devem ser chamadas após a efetivação/fechamento da transação.
Informações adicionais
Na maioria dos casos, esta ocorrência é reproduzida quando codificado um programa, ponto de entrada e/ou rotina auxiliar, para realizar uma manutenção na base de dados em tabelas do sistema ERP, quando chamada dentro de um processo que está transacionando, e inadvertidamente uma das funções DBRUnlock e/ou DBUnlock foi chamada. Para realizar manutenção em tabela do sistema ERP, o Framework da linguagem AdvPL possui as funções RecLock e MsUnlock, que possuem os tratamento necessários para desviar a execução e tratar adequadamente as condições de ambiente, inclusive para o caso destas funções serem executadas em rotinas dentro de uma transação ativa (Begin Transaction / End Transaction).
Para mais informações referente ao comportamento e uso da funções RecLock e MsUnlock, do Framework AdvPL, consulte a documentação disponível na TDN.