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.