Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Comentário: Informações adicionais sobre mudança de comportamento
Ocorrência
  • Algumas operações no SGBD podem gerar locks implícitos e em determinadas condições causar DeadLock.
  • Um DeadLock no SGBD pode afetar a aplicação AdvPL, gerando um travamento dos processos envolvidos.
Implementação
  • Quando solicitado um lock de registro dentro de uma transação, o DBAccess também irá fazer o lock explícito no SGBD.
  • Com o lock explicito no SGBD evitamos que acessos externos ao DBAccess ou operações por fora da engine ISAM atualizem registros "lockados" (em uso).
Informações adicionais
  • Referente ao chamado: DBTEC-443
  • Com este recurso habilitado é possível utilizar o recurso de monitoramento do locks do SGBD para identificação de DeadLocks.
  • O recurso é suportado e implementado para os bancos de dados MSSQL, MYSQL, ORACLE e POSTGRES, e habilitado por default. Para permitir desabilitar esta funcionalidade, verifique a configuração do parâmetro DBAccess - Seção [Environment], chave UseLockInDB
Mudança de comportamento

O uso do lock nativo em transação automaticamente habilita um time-out de 5 segundos de espera pelo bloqueio de uma linha ou recurso no Banco de Dados – vide configuração LockTimeOut. No caso de dois processos tentando inserir registros com a mesma chave única dentro de processos transacionados, o processo que inseriu primeiro mantém o bloqueio do registro a inserir até que seja feito o commit ou rollback dessa transação, enquanto o segundo processo espera pelo commit ou rollback da primeira transação. Por default os bancos de dados esperam indefinidamente pelo encerramento da primeira transação, retornando erro de violação da chave única na segunda transação caso seja feito o commit da primeira transação. Quando utilizado o bloqueio no banco de dados, como existe um timeout por espera de bloqueio de registro, o banco deixa de esperar indefinidamente, e passa a retornar um erro de timeout de inserção na segunda transação, caso a primeira não seja efetivada ou cancelada em até 5 segundos para os bancos de dados MSSQL, MYSQL e POSTGRES.