Ima04

Neste cenário, os sistemas gerenciadores de banco de dados desenvolveram um mecanismo para garantir que a mesma informação não seja atualizada por mais de um usuário ao mesmo tempo, denominado travas, bloqueios ou locks. Dessa forma, no momento em que um usuário solicita uma informação para atualização,  o gerenciador de banco de dados gera um bloqueio para outros usuários até que o processo de atualização do primeiro usuário seja concluído.

Locks por sua vez, tem a função de manter um dado bloqueado por uma seção, ou seja, um usuário que acessou a informação para atualização até que a seção seja concluída com sucesso (commit) ou sem sucesso (rollback).

Múltiplas transações simultâneas atualizando os mesmos dados: E a consistência desses dados?

Trabalharemos nessa primeira introdução, com as definições de transações juntamente com controle de simultaneidade de dados (Data concurrency) mais consistência de dados (Data consistency).

Simultaneidade de dados, trata de que, muitos usuários podem acessar dados ao mesmo tempo.

Consistência dos dados, por sua vez, trata de que, cada usuário tem uma visão consistente dos dados, incluindo mudanças visíveis feitas por transações e operações de outros usuários.

Locks, vilão ou herói?

Herói, se os processos estiverem com a arquitetura escrita corretamente e o banco de dados bem configurado. Vilão, se a arquitetura dos processos não estiver bem escrita.

Para que se tenha dados consistentes em um ambiente com múltiplas transações simultâneas atualizando os mesmos dados, se faz necessário o controle de simultaneidade (Data concurrency)  em que, mais usuários possam acessar dados ao mesmo tempo, e a consistência de dados (Data consistency)  em que, cada usuário tem uma visão consistente dos dados, incluindo mudanças visíveis feitas por transações e operações de outros usuários.

Para os sistemas gerenciadores de banco de dados Oracle,  o gerenciamento de locks é feito totalmente no cabeçalho do bloco em que reside o registro, enquanto que os demais gerenciadores de banco de dados, como o DB2, é feito por um gerenciador de locks, ou seja, o lock manager. Esta estrutura é mais eficiente, pois como o gerenciamento é feito no próprio cabeçalho do registro ,evita possíveis gargalos no caso de grandes atualizações no banco de dados.

Existem duas estruturas de locks feitos pelos gerenciadores de banco de dados, ou seja, os locks para tratamento de linhas e os locks para tratamento de tabelas.

Locks para tratamento de linhas: Qual finalidade e utilização?

Trata-se da estrutura de lock utilizada quando necessitamos fazer uma atualização em uma ou mais linhas da tabela. A partir do momento que estas linhas estão sendo atualizados pelo gerenciador, os demais usuários que necessitarem de uma atualização não conseguirão até que a seção relativa a esta atualização esteja encerrada, quer seja a atualização com sucesso (commit) ou não tenha sucesso na atualização (rollback).

Essas linhas, enquanto atualizadas, poderão ser consultadas por outros usuários ou processos sem nenhum problema, também poderão ser atualizadas outras linhas por outros usuários.

Em relação ao desempenho da aplicação e ao ambiente, o ideal é que ela faça bloqueio somente nas linhas necessárias que serão atualizadas e preferencialmente faça o bloqueio na hora que ela for atualizada, evitando, assim, o bloqueio de linhas por um longo tempo.

Locks para tratamento de tabelas: Qual finalidade e utilização?

Este tipo de lock é utilizado quando necessitamos fazer uma atualização em uma tabela inteira. Quando este tipo de lock é solicitado, o gerenciador faz cópia da tabela na memória para providenciar as alterações e a bloqueia para que ninguém faça alterações em suas linhas enquanto a tabela estiver sendo atualizada.

Aplicações que fazem bloqueio em uma tabela inteira deverão ser executadas em horários pré-determinados a fim de evitar problemas de desempenho no ambiente, ou seja, enquanto esta aplicação estiver bloqueando a tabela por inteira, nenhuma outra aplicação irá conseguir atualizar outra linha desta tabela, somente irá consultá-la.

Para banco de dados Oracle, é a tabela V$LOCK quem gerencia os eventos de locks da instância. Para o sistema gerenciador de banco de dados Oracle existe vários tipos de locks, cada um com características diferentes.

Os tipos de locks do Oracle a nível de tratamento de tabelas são:

Row Share (RS), Row Exclusive (RX),Share (S), Share Row Exclusive (SSX), Exclusive (X) e Dead lock.
Abaixo, o sumário dos modos de bloqueio de tabela com as  declarações e operações que esses bloqueios permitem e proíbem.

Ima01 Ima02

RS: row share

RX: row exclusive

S: share

SRX: share row exclusive

X: exclusive

Row Share (RS):

Principal característica, o bloqueio das linhas antes de fazer as alterações, ou seja, possui linhas locadas, mas ainda não efetuou a alteração nelas.

Em termos de desempenho não é a melhor solução, pois se forem alocadas muitas linhas, elas ficarão indisponíveis para outros usuários enquanto suas alterações não forem concluídas.

Os comandos que solicitam este tipo de lock são:

SELECT */nome_colunas FROM nome_tabela FOR UPDATE

LOCK TABLE nome_tabela IN ROW SHARE MODE

Row Exclusive (RX):

Principal característica, o bloqueio das linhas no momento em que forem alteradas, ou seja, possui linhas locadas, e as alterações estão sendo feitas. É mais eficiente em termos de desempenho, pois as linhas são bloqueadas somente no momento da alteração, com o tempo de bloqueio menor. Em termos de desempenho, o comando SQL que irá fazer as alterações deve ser eficiente para efetuar o bloqueio somente nas linhas que serão alteradas e não bloquear linhas que não sofrerão alterações, evitando desperdício de recursos.

Os comandos que solicitam este tipo de lock são:

INSER INTO nome_tabela

UPDATE nome_tabela

DELETE FROM nome_tabela

LOCK TABLE nome_tabela IN ROW EXCLUSIVE MODE

Share (S)

Principal característica,  permitir que mais de uma seção possa obter o lock de uma tabela, entretanto, o gerenciador somente irá fazer os comandos DML de uma seção por vez, ou seja, quando uma seção encerra, normal ou anormalmente, é que o gerenciador efetua os comandos DML das demais seções.

O comando que solicita este tipo de lock é:

                                                   LOCK TABLE nome_tabela IN SHARE MODE

Share Row Exclusive (SSX)

Principal característica, permitir que somente uma seção possa obter o lock de uma tabela, sendo mais restritivo. Permite também, o bloqueio de algumas linhas, entretanto, somente os comandos DML após encerrar a seção da tabela.

O comando que solicita este tipo de lock é:

                                                    LOCK TABLE nome_tabela IN SHARE ROW EXCLUSIVE MODE

Exclusive (X)

Principal característica, ser o mais poderoso de restrição entre todos os outros, pois permite que as outras seções acessem as linhas somente para consultas. Outra característica importante deste tipo de lock, é que ele pode ser aplicado somente para o bloqueio de linhas, ou seja, quando uma linha estiver travada nenhuma aplicação poderá emitir um comando DML para ela até que seção se encerre normalmente (commit) ou anormalmente (rollback).

Este tipo de lock é obtido automaticamente por meio dos comandos INSERT, UPDATE e DELETE.

O comando que solicita este tipo de lock é:

                     LOCK ROW EXCLUSIVE MODE

Dead lock

Quando dois ou mais usuários estão esperando por acesso a dados que um usuário bloqueou para o outro, é conhecido como um dead lock ou impasse.

Quando ocorre este conflito, as transações deixam de ir em frente, pois elas ficam presas. Nestes casos, os SGBD quebram o impasse, forçando uma ou mais transações a serem desfeitas.

No exemplo abaixo, trata-se de  um impasse, pois não importa quanto tempo cada transação espere, os bloqueios conflitantes são detidos pois nenhum deles consegue obter o recurso que precisa para continuar ou terminar.

ima03

 

No próximo post, aprofundaremos o estudo com exemplos práticos dos tipos de locks ocorridos no ambiente juntamente com ações que podemos aplicar para melhoria dos mesmos.

Até a próxima!

One thought on “Introdução a concorrência e consistência de dados em um ambiente multiusuário – LOCKS

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

CAPTCHA
Change the CAPTCHA codeSpeak the CAPTCHA code