IT SERVICES - Performance/Lentidão/Travamentos - O que são locks e deadlocks no processo de comunicação do sistema com o banco de dados
Dúvida
O que são locks e deadlocks no processo de comunicação do sistema com o banco de dados?
Solução
Importante
Este artigo tem por objetivo dar uma visão resumida do que são locks e deadlocks ocorridos no banco de dados. Para maiores informações sobre esses conceitos, você pode fazer pesquisas na Internet ou acionar o DBA da sua empresa para explicações mais detalhadas.
O lock nada mais é do que um processo natural do banco de dados para garantir integridade de dados pela possível solicitação de alteração de um mesmo registro (linha) em uma tabela por usuário/sessões diferentes.
Exemplo prático: Você está emitindo uma Nota Fiscal no sistema que irá consumir o valor que o Cliente possui de Crédito para compras. No momento da geração da Nota Fiscal a operação que você está realizando no sistema irá criar um lock (uma trava) na linha da tabela que armazena essa informação do Crédito do Cliente até que essa linha seja atualizada (possivelmente no final da geração da NF, quando o processo foi concluído). Esse lock é necessário para que, se um outro usuário do sistema efetuar uma outra NF para o mesmo Cliente no mesmo momento, o banco de dados possa garantir que o dado do Valor de Crédito seja atualizado sequencialmente, diminuindo corretamente o valor de Crédito devido a emissão das duas NF.
O lock é comumente gerado na utilização dos comandos UPDATE, SELETE e SELECT (com indicativo de FOR UPDATE/ROWLOCK, isso porque um select por padrão não causa um lock, pois é somente uma busca de dados, mas se a busca tem por objetivo garantir que esse registro seja travado para ser atualizado em breve, então o indicativo FOR UPDATE/ROWLOCK travará o registro).
O lock é finalizado quando a transação do banco que ocasionou o lock é finalizada (commit) ou desfeita (rollback).
O deadlock é um mecanismo do banco de dados que garante que uma travamento geral do próprio banco não ocorra.
Esse evento de deadlock ocorre quando dois ou mais usuários alteram registros em ordem inversa e acaba que um processo fica à espera de outro.
Exemplo prático (bem simples, para melhor entendimento):
1. Você está emitindo uma Nota Fiscal de número 47 e essa NF tem dois itens. O primeiro item da NF é o produto "ABC" e o segundo item é o produto "XYZ";
2. Ao fechar a NF o sistema irá gerar uma atualização do saldo do estoque dos dois produtos, nesta mesma sequência (primeiro produto "ABC" e depois produto "XYZ").
2.1. Na execução da atualização do estoque disponível do produto "ABC" o processo demora um pouco mais do que o normal, aumentando o tempo do lock no registro;
3. Enquanto que o sistema está com o lock ativo (do passo anterior), um outro usuário em outra sessão do sistema está fechando outra nota fiscal de número 48. O primeiro item dessa outra NF 48 é o produto "XYZ" e o segundo item é o produto "ABC";
3.1. Na execução da atualização do estoque disponível do produto "XYZ" o processo demora um pouco mais do que o normal, aumentando o tempo do lock no registro;
4. O processamento da sessão que você está conectado emitindo a NF 47 vai em frente, tentando acessar o registro de estoque do produto "XYZ", mas ele está em lock pela emissão da NF 48 em outra sessão. Nisso, a sua sessão continua lockando o registro do produto "ABC";
4.1. Então a sua sessão está lockando o registro produto "ABC" e agora está tentando lockar o registro do produto "XYZ"
5. A sessão do outro usuário que está emitindo a NF 48 passou do processamento da atualização de estoque do produto "XYZ", mas continua lockando esse registro. Agora essa sessão tenta lockar o registro de estoque do produto "ABC", que está lockado pela emissão da NF 47.
6. Neste exato momento o banco de dados encerrará um dos processos e gerará uma mensagem de deadlock, conforme exemplo abaixo:
Oracle: ORA-00060: deadlock detected while waiting for resource
Microsoft SQL Server: Transaction (Process ID 323) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction
O deadlock no caso acima ocorrerá porque o banco de dados estaria com dois processos que nunca mais seriam concluídos, pois um ficaria eternamente esperando o outro. Neste caso, um dos processos é escolhido pelo banco de dados para ser encerrado para que o outro processo possa ser seguido, evitando assim o travamento do banco de dados por completo
Importante
Locks são processos normais que ocorrem na operação do sistema para garantir a integridade das informações. Então a existência deles não é uma falha do sistema. Podem existir rotinas que de fato tenham o indicativo do lock do registro no ponto errado da operação e precisem ser ajustadas, mas sempre será necessária uma análise a nível de banco de dados pelo DBA em casos de locks/deadlocks. Isso porque muitos casos de locks que ficam ativos por muito tempo e alta incidência de deadlocks podem estar relacionados pela baixa performance da execução de comandos do banco de dados e outras questões de infraestrutura de onde o sistema está sendo executado.
Observação
Para mais informações sobre o questões relacionadas a Performance/Lentidão/Travamentos do Gestão Empresarial | ERP, consulte o artigo ERP - Performance/Lentidão/Travamentos - Onde é possível encontrar informações diversas sobre questões relacionadas a Performance/Lentidão/Travamentos (índice).