Bloqueio de registro - Record locking

O bloqueio de registro é a técnica de impedir o acesso simultâneo aos dados em um banco de dados , para evitar resultados inconsistentes.

O exemplo clássico é demonstrado por dois funcionários de banco tentando atualizar a mesma conta bancária para duas transações diferentes. Os funcionários 1 e 2 recuperam (ou seja, copiam) o registro da conta . O secretário 1 aplica e salva uma transação. O secretário 2 aplica uma transação diferente à sua cópia salva e salva o resultado, com base no registro original e em suas alterações, sobrescrevendo a transação inserida pelo funcionário 1. O registro não reflete mais a primeira transação, como se ela nunca tivesse ocorrido.

Uma maneira simples de evitar isso é bloquear o arquivo sempre que um registro estiver sendo modificado por qualquer usuário, para que nenhum outro usuário possa salvar os dados. Isso evita que os registros sejam sobrescritos incorretamente, mas permite que apenas um registro seja processado por vez, bloqueando outros usuários que precisam editar os registros ao mesmo tempo.

Para permitir que vários usuários editem uma tabela de banco de dados ao mesmo tempo e também evitar inconsistências criadas por acesso irrestrito, um único registro pode ser bloqueado quando recuperado para edição ou atualização. Qualquer pessoa que tentar recuperar o mesmo registro para edição terá o acesso de gravação negado por causa do bloqueio (embora, dependendo da implementação, eles possam visualizar o registro sem editá-lo). Assim que o registro for salvo ou as edições canceladas, o bloqueio é liberado. Os registros nunca podem ser salvos para sobrescrever outras alterações, preservando a integridade dos dados .

Na teoria de gerenciamento de banco de dados, o bloqueio é usado para implementar o isolamento entre vários usuários de banco de dados. Este é o "I" na sigla ACID .

Uma descrição completa e confiável de bloqueio foi escrita por Jim Gray .

Granularidade de bloqueios

Se os funcionários do banco (para seguir a ilustração acima) atendem a dois clientes, mas suas contas estão contidas em um livro-razão, todo o livro-razão, ou uma ou mais tabelas do banco de dados , precisam ser disponibilizados para edição aos funcionários para para cada um para concluir uma transação, um de cada vez ( bloqueio de arquivo ). Embora seguro, esse método pode causar espera desnecessária.

Se os funcionários puderem remover uma página do livro razão, contendo a conta do cliente atual (mais várias outras contas), vários clientes podem ser atendidos simultaneamente , desde que a conta de cada cliente seja encontrada em uma página diferente das outras. Se dois clientes tiverem contas na mesma página, apenas um poderá ser atendido por vez. Isso é análogo a um bloqueio de nível de página em um banco de dados.

Um grau mais alto de granularidade é alcançado se cada conta individual puder ser feita por um escrivão. Isso permitiria que qualquer cliente fosse atendido sem esperar por outro cliente que está acessando uma conta diferente. Isso é análogo a um bloqueio de nível de registro e normalmente é o mais alto grau de granularidade de bloqueio em um sistema de gerenciamento de banco de dados.

Em um banco de dados SQL , um registro é normalmente chamado de "linha".

A introdução de bloqueios granulares (subconjunto) cria a possibilidade de uma situação chamada conflito . O deadlock é possível quando o bloqueio incremental (bloqueio de uma entidade e, em seguida, bloqueio de uma ou mais entidades adicionais) é usado. Para ilustrar, se dois clientes de banco pedissem a dois balconistas para obter as informações de suas contas para que pudessem transferir algum dinheiro para outras contas, as duas contas seriam essencialmente bloqueadas. Então, se os clientes dissessem aos seus balconistas que o dinheiro seria transferido para as contas uns dos outros, os balconistas procurariam as outras contas, mas descobririam que estavam "em uso" e esperariam que fossem devolvidas. Sem saber, os dois balconistas estão esperando um pelo outro e nenhum deles pode concluir a transação até que o outro desista e devolva a conta. Várias técnicas são usadas para evitar esses problemas.

Uso de fechaduras

Os bloqueios de registros precisam ser gerenciados entre as entidades que os solicitam, de modo que nenhuma entidade receba muitos serviços por meio de concessões sucessivas e nenhuma outra entidade seja bloqueada de maneira efetiva. As entidades que solicitam um bloqueio podem ser aplicativos individuais (programas) ou um processador inteiro.

O aplicativo ou sistema deve ser projetado de forma que qualquer bloqueio seja mantido pelo menor tempo possível. A leitura de dados, sem recursos de edição, não requer um bloqueio, e a leitura de registros bloqueados geralmente é permitida.

Dois tipos principais de fechaduras podem ser solicitados:

Fechaduras exclusivas

As fechaduras exclusivas são, como o nome indica, detidas exclusivamente por uma única entidade, normalmente para efeitos de escrita no registo. Se o esquema de bloqueio fosse representado por uma lista, a lista de portadores conteria apenas uma entrada. Uma vez que este tipo de bloqueio bloqueia efetivamente qualquer outra entidade que requer o bloqueio do processamento, deve-se ter cuidado para:

  • certifique-se de que a fechadura seja mantida pelo menor tempo possível;
  • não reter o bloqueio em chamadas de sistema ou função onde a entidade não está mais em execução no processador - isso pode levar a um impasse;
  • certifique-se de que, se a entidade for encerrada inesperadamente por qualquer motivo, o bloqueio será liberado.

Os não detentores da trava (também conhecidos como garçons ) podem ser mantidos em uma lista que é atendida de forma round-robin ou em uma fila FIFO . Isso garantiria que qualquer garçom possível teria chances iguais de obter o bloqueio e não seria bloqueado. Para acelerar ainda mais o processo, se uma entidade adormeceu à espera de um bloqueio, o desempenho é melhorado se a entidade for notificada da concessão, em vez de descobri-la em algum tipo de ativação acionada por tempo limite do sistema.

Bloqueios compartilhados

Os bloqueios compartilhados diferem dos bloqueios exclusivos porque a lista de portadores pode conter várias entradas. Os bloqueios compartilhados permitem que todos os proprietários leiam o conteúdo do registro, sabendo que o registro não pode ser alterado até que o bloqueio seja liberado por todos os proprietários. Bloqueios exclusivos não podem ser obtidos quando um registro já está bloqueado (exclusivamente ou compartilhado) por outra entidade.

Se as solicitações de bloqueio para a mesma entidade estiverem enfileiradas, uma vez que um bloqueio compartilhado seja concedido, quaisquer bloqueios compartilhados enfileirados também podem ser concedidos. Se um bloqueio exclusivo for encontrado em seguida na fila, ele deve esperar até que todos os bloqueios compartilhados tenham sido liberados. Assim como acontece com os bloqueios exclusivos, esses bloqueios compartilhados devem ser mantidos pelo menos tempo possível.

Veja também

Referências