Níveis de Isolamento Transacional e Tipos de Bloqueios

Olá, pessoal!

Nesse artigo iremos falar um pouco sobre o assunto que sempre vem à tona no dia a dia quando se trata de um ambiente de banco de dados. Iniciamos nosso artigo com algo que muitos esquecem, mas relembrar é necessário: estamos falando sobre ACID. Abaixo descrevemos resumidamente.

(A)tomicidade (Atomicity): Garante que cada transação seja executada de forma “tudo ou nada”, ou seja, as alterações realizadas em uma transação são confirmadas ou não. Não é possível confirmar apenas parte de uma transação.

(C)onsistência (Consistency): Garante que transações modifiquem tabelas de forma predefinidas, ou seja, mantém as tabelas consistentes no caso de corrupção de dados para que nenhuma das regras e restrições definidas no banco de dados seja violada.

(I)solamento (Isolation): Garante que modificações realizadas numa transação sejam isoladas das outras transações até que a transação corrente seja confirmada (commit) ou não (rollback). Essa propriedade garante que vários usuários possam ler e escrever na mesma tabela simultaneamente, pois cada transação é isolada.

(D)urabilidade (Durability): Garante que, uma vez que os dados foram confirmados (commit), em caso de falha eles estarão disponíveis. No SQL Server essa durabilidade é realizada quando registros do log são confirmados e gravados no datafile.

Agora, sabendo do que se trata o ACID, vamos a um ponto importante dessa propriedade, o isolamento voltado ao SQL Server. Vale ressaltar que, implementar o isolamento é algo complexo, pois ele deve garantir que a execução simultânea de múltiplas transações leve o sistema ao mesmo estado que se estivessem sendo executadas em série. No entanto, na maioria dos sistemas de gerenciamento de banco de dados (SGBD), essa regra costuma ser relaxada através dos níveis de isolamento.

O SQL Server oferece suporte a seis níveis de isolamento, que estão separados em duas categorias:

Nível pessimista:

Read Uncommitted;

                                – Read Committed;

                                – Repeatable read;

                                – Serializable.

Nível otimista:

                                – Read Commited Snapshot;

                                – Snapshot.

Após conhecer sobre os níveis de isolamento, vamos falar um pouco sobre os principais tipos de locks, pois eles dão suporte ao requisito de isolamento da transação. Os bloqueios são adquiridos a nível de linhas de dados, páginas, tabelas, banco de dados, entre outros.

Por default, o SQL Server usa bloqueios por nível de linhas de dados, o que dificulta problemas de simultaneidade.

Sendo assim, vamos ver alguns tipos de Locks:

Exclusive Locks (X):

São adquiridos por escritores (INSERT/UPDATE/DELETE/MERGE). Esses comandos adquirem o bloqueio exclusivo nas linhas que serão afetadas e mantem até o final da transação, pois uma única sessão pode manter o bloqueio exclusivo em qualquer momento. Comportamento esse que nos mostra a regra de simultaneidade mais importante: múltiplas sessões não podem modificar os mesmos dados, pois as outras sessões não conseguem adquirir bloqueios exclusivos na linha até que a transação anterior tenha se encerrado. Quanto maior for a transação, maior será o tempo de bloqueio. Esse tipo de lock não é afetado pelos níveis de isolamento.

Intent Locks (I*):

São mantidos em páginas de dados e nos níveis de tabelas, indicando bloqueios nos objetos filhos, isso ajuda a melhorar a performance em relação ao bloqueio no nível de linha.

Update Locks (U):

São adquiridos durante modificações de dados (Update), enquanto procura pelas linhas a serem modificadas. Depois que o bloqueio é adquirido o SQL Server analisa se a linha precisa ser atualizada, verificando os dados em relação aos predicados do comando e, se for o caso, será alterado para o tipo de bloqueio exclusivo (X) e realiza a modiicação dos dados.

Shared Locks (S):

São adquiridos durante o processo de leitura (Select) e são compatíveis entre si e, sendo que várias sessões podem conter bloqueios compartilhados (S) no mesmo recurso.

Alguns pontos que devemos nos atentar:

Bloqueios Intent (IS/IX/IU) são compatíveis entre si. Eles indicam a existência de bloqueios nos objetos filho e, várias sessões podem manter esse tipo de bloqueio nos níveis de objetos e de página simultaneamente.

Bloqueios Exclusive (X) são incompatíveis entre si e com qualquer outro tipo de bloqueio. Não podendo atualizar a mesma linha simultaneamente em várias sessões. Leitores (Select) que adquirem bloqueios compartilhados (S) não podem ler linhas não confirmadas com o bloqueio exclusivo (X).

Bloqueios Update (U) são incompatíveis entre si e com bloqueios exclusivos (X). Escritores não podem avaliar se a linha necessita de atualização simultânea e nem acessar uma linha com bloqueio exclusivo (X). Mas o bloqueio Update(U) é compatível com os bloqueios compartilhados (S), dessa forma, escritores podem avaliar se a linha precisa ser atualizada sem bloqueio ou bloqueada por leitores. Sendo assim, essa compatibilidade de bloqueio é o principal motivo que o SQL Server usa bloqueios de atualização (U), reduzindo assim o bloqueio entre leitores (Select) e escritores (Insert/Delete/Update).

Nesse artigo fizemos um resumo sobre os níveis de isolamentos e os principais tipos de locks, espero que ajude no entendimento e possa colaborar com os estudos. Num próximo artigo daremos continuidade expandindo sobre os níveis pessimista e otimista.

Até o próximo post! 😊

Categorias

Artigos Recentes

Um Pouco sobre a LGPD – Lei Geral de Proteção aos Dados

Fale Conosco

Converse com nossos especialistas e descubra como transformar seus dados em informações seguras, disponíveis e acessíveis.

Endereço

Rua Angelo Antonello, 93 – Sala 62, Centro – Farroupilha/RS – CEP: 95170-492

Contato Comercial

Email: contato@cdbdatasolutions.com.br
Telefone: (54) 3401-1471

Abrir bate-papo
Olá
Podemos ajudar?