Uploaded by isaaksalus

Artigo Concorrência Banco de Dados

advertisement
Capítulo
1
Controle de Concorrência em Oracle
Isaak G. de Araújo, Maicon M.B Morandini, Gabriela G. de Andrade,
Gabriel P. Rodrigues, Lucas M.D Souza, José G. Fernandes, Camila O.
Gomes, Victor O. Peters, João L.A.M de Jesus
Resumo
O controle de concorrência desempenha um papel essencial em sistemas de gerenciamento de banco de dados para garantir a consistência e a integridade dos dados em
ambientes multiusuários. No contexto do Oracle Database, a complexidade das transações concorrentes exige abordagens sofisticadas para gerenciar acessos simultâneos às
informações armazenadas. Este artigo explora as estratégias de controle de concorrência empregadas pelo Oracle, abrangendo bloqueios, isolamento de transações, controle
de versões e técnicas avançadas de resolução de conflitos. Além disso, são discutidos os
desafios associados a um controle eficiente de concorrência, como o compromisso entre
o desempenho e a consistência. Ao compreender as nuances do controle de concorrência no Oracle, os profissionais de bancos de dados podem tomar decisões informadas ao
projetar sistemas que atendam aos requisitos de simultaneidade, durabilidade e precisão
dos dados.
Palavras-chave: Banco de dados, Oracle, Controle de concorrência
1.1. Introdução
Em um mundo cada vez mais orientado por dados, a capacidade de manipular e gerenciar informações de forma eficaz e concorrente é essencial para o sucesso de sistemas de
gerenciamento de banco de dados em ambientes multiusuários. No contexto do Oracle
Database, um dos sistemas de gerenciamento de banco de dados mais proeminentes, o
desafio de garantir a integridade e a consistência dos dados em meio a operações concorrentes é de extrema importância.
A Oracle Corporation é uma gigante na indústria de tecnologia, conhecida principalmente pelo Oracle Database. Trata-se de um Sistema de Gerenciamento de Banco
de Dados Relacional (SGBD) que serve como um mecanismo para armazenar, recuperar e gerenciar informações [ora, 2023b]. Sendo utilizado por uma ampla gama de organizações, desde pequenas empresas até grandes corporações multinacionais, o Oracle
Database tornou-se um pilar fundamental na gestão de dados. Seu escopo de aplicação
abrange diversas vertentes, incluindo finanças, saúde, varejo, serviços e muito mais.
Nesse contexto, assegurar que os usuários possam acessar e modificar dados simultaneamente, ao mesmo tempo em que mantêm a consistência dos resultados, é um
desafio técnico complexo que requer abordagens cuidadosamente projetadas. Questões
como leituras sujas, atualizações conflitantes e acesso simultâneo a recursos são apenas
algumas das áreas que o controle de concorrência precisa abordar de maneira eficiente.
Este artigo tem como objetivo explorar o cenário do controle de concorrência no
Oracle Database, abordando os mecanismos e as técnicas utilizadas para manter a harmonia entre operações concorrentes e a integridade dos dados.O documento contextualiza as
estratégias empregadas pelo Oracle Database para lidar com o controle de concorrência e
garantir a consistência dos dados.Onde abrange-se tópicos como os níveis de isolamento
de transações, mecanismos de bloqueio, utilização de versões de dados e resolução de
conflitos. Além disso, analisa-se os compromissos necessários entre desempenho e consistência, uma vez que alcançar um isolamento completo das transações pode impactar
significativamente o rendimento do sistema.
1.2. Sistema de Gerenciamento de Banco de Dados (SGBD)
Um Sistema de Gerenciamento de Banco de Dados (SGBD) é uma ferramenta essencial no mundo da tecnologia da informação, responsável por controlar o armazenamento,
organização e recuperação eficiente de dados [Elmasri and Navathe, 2019]. Este componente fundamental desempenha um papel crucial na manipulação de informações em uma
variedade de aplicações e sistemas.
Um SGBD é composto por elementos interconectados que colaboram para seu
funcionamento harmonioso,o primeiro deles é o código Kernel, um componente que atua
como o cérebro do SGBD, gerenciando aspectos críticos como alocação de memória e administração de armazenamento.Seguido pelo repositório de Metadados conhecido como
o dicionário de dados,onde a estrutura e definições dos dados são armazenados. Isso
fornece um guia fundamental para a compreensão dos dados contidos no banco.E para
funcionamento pleno do SGBD também deve ser levado em consideração a linguagem de
consulta,que é uma interface vital que permite que aplicativos e sistemas acessem e manipulem dados. Essa linguagem facilita a busca por informações específicas e a realização
de operações sobre os dados [Özsu and Valduriez, 2011].
1.3. Controle de concorrência
Controle de concorrência é um conjunto de técnicas e mecanismos que garantem a consistência e integridade dos dados ao lidar com múltiplas transações concorrentes que
acessam e modificam os mesmos dados simultaneamente [Gray and Reuter, 1993].Nesse
caso,quando usuários distintos tentam acessar a mesma informação,é feito um controle
entre essas transações.Existem diversas técnicas de controle de concorrência que são utilizadas como forma de assegurar a propriedade de não interferência entre uma operação e
outra, ou o isolamento das transações executadas ao mesmo tempo. Grande parte dessas
técnicas garante a serialização, que é a execução das transações de forma serial.
Figura 1.1: Controle de concorrência.
Os principais propósitos do controle de concorrência são,garantir a propriedade de
isolamento em transações concorrentes e preservar a consistência do banco na execução
das transações,alem de resolver conflitos leitura-gravação e gravação-gravação
O Oracle utiliza um protocolo de controle de concorrência baseado em bloqueios
(locks) para garantir a consistência dos dados. Existem diferentes tipos de bloqueios que
podem ser aplicados aos objetos do banco de dados, como linhas, páginas e tabelas, a fim
de controlar o acesso concorrente.
A Figura 1.1 ilustra um sistema de controle de concorrência,onde em um banco de
dados,usuarios distintos tentam acessar a mesma informação e então e feito um controle
sobre essas transações.
1.3.1. ACID
Como citado na seção 6.3 quando um banco de dados é utilizado por vários usuários, é
crucial lidar com o gerenciamento de concorrência para garantir que as informações acessadas por esses usuários permaneçam consistentes. O controle de concorrência refere-se à
situação em que diferentes usuários tentam acessar os mesmos dados no banco de dados,
o que requer a coordenação dessas transações.
Para resolver esse problema, são empregadas diversas técnicas de controle de concorrência, todas destinadas a preservar a separação entre as operações e o isolamento das
transações executadas simultaneamente. Muitas dessas técnicas buscam alcançar a serialização, que implica na execução sequencial das transações. Para alcançar esse objetivo,
é vital entender o conceito de transações, que compreende todas as operações executadas
desde o início até o fim de uma ação. Gerenciar transações envolve a aplicação das propriedades conhecidas como ACID (Atomicidade, Consistência, Isolamento e Durabilidade),
que constituem a base dos métodos de controle de concorrência e recuperação do Sistema
Gerenciador de Banco de Dados (SGBD) [ora, 2023a].
A Atomicidade reforça que uma transação é uma entidade de processamento indivisível, ou seja, ela deve ser executada por completo ou não ser executada de modo algum.
Caso ocorra algum problema durante uma transação, as alterações parciais realizadas no
banco de dados precisam ser desfeitas. Para realizar esse processo de reversão, o banco de
dados deve ser capaz de emitir os comandos necessários para desfazer a transação afetada,
assegurando, assim, a integridade geral do banco de dados.
A Consistência, por sua vez, garante que uma transação possa ocorrer do início ao
fim sem sofrer interferência de outras transações durante seu curso. Em outras palavras,
uma transação ocorre isoladamente, levando o banco de dados de um estado consistente
para outro.
Já o Isolamento é responsável por garantir que uma transação pareça ocorrer independentemente de outras, mesmo quando várias transações são executadas simultaneamente. O sistema deve assegurar que, para cada conjunto de transações, uma seja concluída antes que outra inicie. Dessa forma, a execução de uma transação específica não é
afetada por outras transações ocorrendo simultaneamente.
Por fim, a Durabilidade assegura que as alterações feitas no banco de dados ao
finalizar com sucesso uma transação sejam permanentes.Mesmo diante de falhas do sistema, os dados gravados durante uma operação bem-sucedida devem persistir no banco
de dados, garantindo a confiabilidade das informações.
1.4. Mecanismos de Controle de Concorrência no Oracle
O Oracle Database, como um Sistema Gerenciador de Banco de Dados (SGBD) robusto
e amplamente utilizado, emprega diversos mecanismos de controle de concorrência para
gerenciar de forma eficiente as operações concorrentes. Esses mecanismos são fundamentais para garantir que múltiplas transações possam ocorrer simultaneamente sem comprometer a consistência e a precisão dos dados.
Um dos principais mecanismos de controle de concorrência no Oracle é a utilização de bloqueios (locks) para isolar transações e evitar conflitos de acesso aos dados.
Os bloqueios são utilizados para regular o acesso às informações armazenadas no
banco de dados, evitando situações em que duas ou mais transações possam interferir
umas nas outras e causar inconsistências nos dados.
Em essência, um bloqueio é uma marca ou sinal que é aplicado a um recurso,
como uma linha em uma tabela, uma página de dados ou um objeto do banco de dados.
Esse sinal indica que uma transação está usando ou modificando esse recurso e que outros
acessos concorrentes devem ser gerenciados de forma controlada para evitar conflitos.
1.4.1. Tipos de Bloqueios
Existem vários tipos de bloqueios utilizados no Oracle e outros sistemas de banco de
dados.A Oracle utiliza um sistema de gerenciamento de bloqueios (locks) sofisticado para
controlar o acesso concorrente aos dados armazenados no banco de dados. Esse sistema é
projetado para equilibrar a necessidade de isolamento das transações com o desempenho
geral do sistema. Os bloqueios são categorizados principalmente em dois tipos: bloqueios
de linha e bloqueios de tabela [ora, 2023a].
1.4.1.1. Bloqueios de Linha
• Bloqueios de Leitura (Shared Locks): Quando uma transação precisa ler uma linha
de dados, ela pode adquirir um bloqueio de leitura. Isso permite que várias transações
leiam a mesma linha simultaneamente. No entanto, um bloqueio de leitura não impede
outras transações de adquirir bloqueios de leitura para a mesma linha. Portanto, vários
bloqueios de leitura podem coexistir.
• Bloqueios de Escrita (Exclusive Locks): Quando uma transação precisa modificar
uma linha de dados, ela adquire um bloqueio de escrita [Gray and Reuter, 1993]. Esse
bloqueio impede que outras transações adquiram bloqueios de leitura ou escrita para
a mesma linha. Portanto, apenas uma transação por vez pode obter um bloqueio de
escrita em uma linha específica.
A Oracle utiliza um mecanismo conhecido como Two-Phase Locking para gerenciar bloqueios de linha. Nesse método, as transações adquirem todos os bloqueios
necessários antes de liberar qualquer bloqueio. Isso ajuda a evitar conflitos e situações de
impasse, onde duas ou mais transações ficam aguardando recursos que não serão liberados.
1.4.1.2. Bloqueios de Tabela
• Bloqueios de Tabela Compartilhada (Shared Table Locks): Um bloqueio de tabela
compartilhada permite que várias transações acessem a tabela simultaneamente para
leitura. Isso é útil para permitir que várias transações acessem os dados sem restrições
durante a leitura.
• Bloqueios de Tabela Exclusiva (Exclusive Table Locks): Um bloqueio de tabela exclusiva impede que outras transações adquiram qualquer tipo de bloqueio (de leitura ou
escrita) na tabela. Isso é usado quando uma transação precisa executar uma operação
que requer alterações estruturais na tabela, como adicionar ou remover colunas.
A Oracle utiliza um método mais flexível para bloqueios de tabela, permitindo
que várias transações adquiram bloqueios de tabela compartilhada ao mesmo tempo. No
entanto, um bloqueio de tabela exclusiva é obtido exclusivamente e impede que outras
transações acessem a tabela enquanto ele estiver presente.
É importante observar que a Oracle também implementa algoritmos de detecção
e resolução de bloqueios para evitar impasses e garantir que as transações continuem
progredindo, mesmo quando ocorrem conflitos de bloqueio.
O sistema de gerenciamento de bloqueios da Oracle é projetado para garantir a
integridade dos dados, a consistência das transações e o desempenho eficiente em ambientes concorrentes. Isso é fundamental para manter a confiabilidade e a eficácia dos
sistemas de banco de dados em ambientes de uso intenso e com várias transações ocorrendo simultaneamente [ora, 2023a].
Figura 1.2: Tipos de bloqueio [Silberschatz et al., 2010].
A Figura 1.2 ilustra os dois tipos de bloqueio (linha e tabela) em um cenário hipotético em que o usuário JOSE executa um UPDATE (sem COMMIT) alterando a UF
do cliente com código igual a 10020 (UPDATE CLIENTE SET UF=’RS’ WHERE CODIGO=10020) e na sequência a usuária MARIA deseja colocar o nome do mesmo cliente
com as letras iniciais em maiúsculo (UPDATE CLIENTE SET NOME=INITCAP(NOME)
WHERE CODIGO=10020).
Essa situação fará com que a instrução de MARIA espere a liberação de JOSE,
pois o registro do cliente 100252 está sob um bloqueio exclusivo. Além disso, toda a
tabela precisa ser bloqueada (bloqueio compartilhado) para que ela não seja alterada (ou
até mesmo removida) durante o processo de alteração. A figura a seguir ilustra o cenário
proposto.
1.4.1.3. Deadlock
Em ambientes concorrentes, a garantia da integridade dos dados é um desafio. Um dos
desafios mais complexos e intrincados é a ocorrência de deadlocks. Um deadlock ocorre
quando duas ou mais transações ficam presas em um impasse, cada uma aguardando
um recurso que a outra transação possui, resultando em uma situação em que nenhuma
das transações pode avançar. Esse cenário potencialmente prejudicial pode paralisar a
operação normal do sistema e prejudicar a produtividade.
A Oracle aborda esse desafio por meio de algoritmos de detecção e resolução de
deadlocks. Quando uma transação é identificada como parte de um deadlock, a Oracle
intervém para romper o impasse e permitir que pelo menos uma das transações prossiga.
Isso é realizado por meio da escolha criteriosa de uma das transações para ser interrompida temporariamente, permitindo que as outras continuem. Essa seleção é baseada em
critérios como o tempo de execução da transação e sua prioridade.
Além disso, a Oracle oferece ferramentas e recursos que permitem aos administradores de banco de dados monitorar a ocorrência de deadlocks e analisar suas causas
subjacentes. Isso permite uma abordagem proativa para identificar padrões de impasse e
tomar medidas preventivas, como ajustar o design do banco de dados, otimizar consultas ou ajustar as estratégias de bloqueio para minimizar a probabilidade de ocorrência de
deadlocks.
Nesta seção, exploramos os principais tipos de bloqueios: os bloqueios de linha
e os bloqueios de tabela. Os bloqueios de linha, como os bloqueios de leitura e escrita,
permitem uma gestão precisa e granular do acesso aos dados em nível de registro. Por
outro lado, os bloqueios de tabela, compartilhados e exclusivos, permitem controlar o
acesso à tabela como um todo, garantindo tanto a disponibilidade para leitura quanto a
execução de operações estruturais exclusivas.
É importante destacar que, embora tenhamos focado nos bloqueios de linha e de
tabela, existem outros tipos de bloqueios utilizados pela Oracle para lidar com situações
mais específicas. Alguns exemplos incluem bloqueios de modo compatível (compatibility mode locks), bloqueios de recursos (resource locks) e bloqueios em nível de bloco
(block-level locks), que são empregados para otimizar o desempenho e a eficiência em
diferentes cenários.
Além disso, a discussão sobre mecanismos de controle de concorrência não estaria
completa sem abordar os chamados deadlocks.Felizmente, a Oracle emprega algoritmos
sofisticados de detecção e resolução de deadlocks, garantindo que, quando detectados,
esses impasses sejam quebrados de forma a permitir que as transações continuem.
Assim, por meio da implementação cuidadosa de bloqueios de linha, bloqueios de
tabela e estratégias de prevenção de deadlocks, a Oracle demonstra seu compromisso em
proporcionar um ambiente de banco de dados seguro, confiável e eficiente para aplicações
empresariais e sistemas que requerem operações concorrentes e simultâneas.
1.5. Gerenciando a Consistência de Dados no Oracle Database
No Oracle Database, o modelo de consistência de várias versões é fundamental para alcançar a consistência de dados. Esse modelo permite que o banco de dados gerencie várias
versões de dados simultaneamente, permitindo que cada transação acesse uma visão consistente dos dados em um ponto específico no tempo. Isso é particularmente importante
ao lidar com consultas e transações concorrentes, evitando problemas como leituras sujas
- uma situação em que uma transação lê dados não confirmados de outra transação.
O Oracle Database utiliza diferentes níveis de isolamento para controlar a visibilidade das alterações feitas por transações em consultas concorrentes. Os níveis de isolamento determinam o ponto no tempo até o qual os dados apresentados a uma consulta
permanecem consistentes. Os níveis de isolamento disponíveis incluem:
• Read Committed: Cada consulta vê os dados confirmados até o momento em que a
consulta foi aberta, evitando leituras sujas.
• Serializable: As transações veem dados consistentes com o início da transação, mesmo
quando várias consultas ocorrem dentro da mesma transação [Gray and Reuter, 1993].
• Somente Leitura: Fornece uma visão de leitura consistente dos dados, adequada para
cenários em que apenas consultas são permitidas.
O Oracle Database aplica a consistência de leitura em nível de instrução para
garantir que uma única consulta sempre recupere dados confirmados e consistentes em um
ponto específico no tempo. Esse ponto é determinado com base no nível de isolamento e
na natureza da própria consulta.
Os dados de desfazer desempenham um papel fundamental na obtenção da consistência de leitura. Quando uma transação modifica dados, o banco de dados gera entradas
de desfazer e as armazena em segmentos de desfazer [Elmasri and Navathe, 2019]. Esses
segmentos contêm versões históricas de dados, permitindo que o banco de dados reconstrua visões consistentes dos dados em diferentes momentos. A consistência de leitura é
mantida usando instantâneos de dados de segmentos de desfazer, garantindo consultas
sem bloqueio e preservando a integridade dos dados.
Tambem deve se levar em consideração o padrão ANSI/ISO onde se define níveis
de isolamento de transação, que ditam o grau de interação permitida entre transações em
execução simultânea. O Oracle Database fornece os níveis de isolamento read committed
(padrão) e serializable, cada um oferecendo diferentes níveis de proteção contra fenômenos como leituras sujas, leituras não repetíveis e leituras fantasmas [ora, 2023a].
O modelo de consistência de várias versões do Oracle Database, juntamente com
seus diversos níveis de isolamento e mecanismos de bloqueio, garante a integridade, consistência e confiabilidade dos dados em ambientes multiusuário. Esses recursos permitem
o acesso simultâneo aos dados, mantendo uma visão coerente das informações para cada
transação ou consulta.
1.6. Conclusão
Neste artigo, exploramos a importância do controle de concorrência no contexto do Oracle
Database e sua contribuição fundamental para manter a integridade dos dados em ambientes multiusuários. Analisamos os mecanismos de bloqueio utilizados pela Oracle para
garantir o isolamento e a consistência das transações concorrentes.Esses mecanismos são
cruciais para evitar conflitos e garantir que as operações ocorram de forma ordenada e
controlada.
Em resumo, o Oracle Database demonstra sua robustez e eficácia ao empregar
uma variedade de mecanismos de controle de concorrência para garantir a consistência, a
integridade e a eficiência dos dados em ambientes de múltiplos usuários. Esses recursos
são essenciais para atender às demandas de sistemas empresariais e aplicações críticas,
onde a concorrência de transações é uma realidade constante. Portanto, a compreensão
e a aplicação adequada desses conceitos são cruciais para maximizar o desempenho e a
confiabilidade do Oracle Database em cenários reais.
Referências
[ora, 2023a] (2023a). Oracle database administrator’s guide.
[ora, 2023b] (2023b). Oracle database concepts.
[Elmasri and Navathe, 2019] Elmasri, R. and Navathe, S. B. (2019). Fundamentals of
Database Systems. Pearson.
[Gray and Reuter, 1993] Gray, J. and Reuter, A. (1993). Transaction Processing: Concepts and Techniques. Morgan Kaufmann.
[Silberschatz et al., 2010] Silberschatz, A., Korth, H. F., and Sudarshan, S. (2010). Database System Concepts. McGraw-Hill.
[Özsu and Valduriez, 2011] Özsu, M. T. and Valduriez, P. (2011). Principles of Distributed Database Systems. Springer.
Download