Baixe o app para aproveitar ainda mais
Prévia do material em texto
21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 1/91 Implementação de Banco de Dados Distribuídos Prof. Sidney Nicolau Venturi Filho Descrição O processamento de transações em um Banco de Dados Distribuídos e o seu controle durante a execução concorrente. Propósito Entender as técnicas que dão suporte ao funcionamento das transações e consultas em um Banco de Dados Distribuídos é de importância fundamental para o profissional de T.I. Preparação Para os procedimentos propostos neste conteúdo, sugerimos que instale o PostgreSQL em sua máquina e em uma máquina virtual. Objetivos 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 2/91 Módulo 1 Controle de transação distribuída Reconhecer as técnicas utilizadas em transações distribuídas. Módulo 2 Controle de concorrência em banco de dados distribuídos Analisar as técnicas de controle de concorrência. Módulo 3 Consultas distribuídas Identificar as formas de otimização de consultas em bancos de dados distribuídos. Módulo 4 SQL em consultas distribuídas Aplicar comandos utilizando SQL em consultas distribuídas. Introdução 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 3/91 Os bancos de dados distribuídos trazem novos desafios para temas que há muito tempo são estudos na área de banco de dados. O processamento de transações, o controle do acesso concorrente aos itens de dados o processamento de consultas e a escrita de comandos SQL necessitam ser ajustados à realidade da distribuição dos dados. Este é nosso grande propósito neste conteúdo, analisar como um banco de dados distribuído pode ser implementado. 1 - Controle de transação distribuída Ao �nal deste módulo, você será capaz de reconhecer as técnicas utilizadas em transações distribuídas. Fundamentos de transação 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 4/91 Neste vídeo, apresentaremos os fundamentos de uma transação de banco de dados, abodaremos os conceitos de atomicidade, isolamento, consistência, durabilidade e quais são os tipos de transações em banco de dados distribuídos. O que é uma transação? Uma transação pode ser conceituada como o conjunto de operações executadas por um usuário em um banco de dados que é visto pelo SGBD como uma unidade lógica que precisa manter certas propriedades para garantir o sucesso sem perda de informações lógicas. A abertura da uma transação pode ser realizada de forma explícita ou implícita. Conheça as diferenças a seguir. Abertura explícita É realizada pelo comando BEGIN TRANSACTION. Abertura implícita Ocorre em alguns SGBD, como por exemplo, o ORACLE, onde ao se emitir o primeiro comando é aberta automaticamente uma transação. O término de uma transação pode ocorrer pelos seguintes motivos: I Por uma falha no processamento de um comando: indica que todas as alterações realizadas pela transação serão desfeitas automaticamente. II 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 5/91 Pelo comando COMMIT emitido pelo usuário: indica ao banco de dados que a transação terminou e faz com que as alterações realizadas sejam efetivadas nas tabelas. III Pelo comando ROLLBACK emitido pelo usuário: indica ao banco de dados que a transação terminou e faz com que as alterações realizadas sejam desfeitas nas tabelas. No conceito de transação, falamos algumas propriedades que devem ser mantidas. Mas quais são elas? Uma transação deve atender a um conjunto de propriedades denominada ACID, que quer dizer: A Atomicidade C Consistência I Isolamento D Durabilidade 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 6/91 A seguir, apresentaremos cada uma destas propriedades de maneira detalhada. Atomicidade A propriedade da atomicidade implica que uma transação é uma unidade única, ou seja, se realizam todas as operações ou não se realiza nenhuma. A seguir, temos a tabela de contas correntes de um banco. O cliente J. Silva possui duas contas, 1000 e 1002, e deseja fazer uma transferência entre elas. NRCC Nome CPF Saldo 1000 J. Silva 123 500,00 1001 A. Barros 143 500,00 1002 J. Silva 123 200,00 1003 S. Sales 223 500,00 Tabela: Conta corrente. Sidney Nicolau Venturi Filho Uma transferência pode ser entendida como um débito na conta 1000 e o posterior crédito na conta 1002. Inicialmente, é comandado o débito, veja o comando a seguir: SQL A imagem a seguir, exemplifica a operação de débito realizada: UPDATE CONTA SET SALDO = SALDO – 200 WHERE NRCC = 1000 1 2 3 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 7/91 Débito na conta 1000. Em seguida, é comandado o crédito, conforme o código a seguir: SQL Veja na imagem como ficaria a operação de crédito realizada: Crédito na conta 1002. Porém, antes que a transação seja efetivada, ocorre um erro no banco, ou seja, a operação de crédito falha (imagem a seguir). UPDATE CONTA SET SALDO = SALDO + 200 WHERE NRCC = 1002 1 2 3 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 8/91 O crédito na conta 1002. Note que o débito foi realizado, mas o crédito não. Isso ocorre devido ao fato de que cada operação foi considerada uma transação separada, alguns SGBD como o SQL SERVER, ao não receberem um comando explicito de abertura de transação, fazem COMMIT automático de cada comando. Esse comportamento, como no caso do exemplo, leva a um erro, pois como se tratava de uma transferência, não faz sentido realizar apenas uma das operações. Então, devemos “prender” os dois comandos em uma única transação, vejamos o código a seguir: SQL Veja, na próxima imagem, a operação realizada: Transferência realizada. BEGIN TRANSACTION UPDATE CONTA SET SALDO = SALDO – 200 WHERE NRCC = 1000 UPDATE CONTA SET SALDO = SALDO + 200 1 2 3 4 5 6 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 9/91 Consistência Esta propriedade estabelece que a execução de uma transação isolada (ou seja, sem a execução de outra transação qualquer concorrentemente) preserva a consistência do banco de dados. Uma transação deve levar um banco de um estado consistente para outro estado consistente, igual ou diferente do estado anterior, ainda que durante sua execução o banco fique inconsistente (imagem a seguir). Execução de transação. Veja um exemplo, considere a tabela de conta corrente ilustrada na imagem a seguir. Voltemos à situação do cliente que deseja fazer uma transferência de R$200,00 da conta 1000 para conta 1002. Conta corrente. Qual é a posição consistente neste caso? A soma do saldo da conta 1000 com a da conta 1002 é de R$700,00. Desta forma, ao final da transação, a soma dos saldos dever ter este valor: SQL BEGIN TRANSACTION UPDATE CONTA 1 2 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 10/91 Se a transação termina com COMMIT, a transação é efetivada e a soma dos saldos é R$700,00. Portanto, temos um novo estado consistente, pois o saldo de cada uma das contas mudou, como podemos conferir na imagem a seguir: Transferência realizada. Entretanto, se a transação termina com ROLLBACK, as operações são desfeitas e o banco de dados volta ao estado consistente inicial, já que a soma do saldo continua sendo R$700,00. Observe na imagem. Transferênciacancelada. Isolamento A propriedade do isolamento define que as operações de uma transação não podem ser afetadas pelas operações de outra transação que esteja sendo executada de forma concorrente. Para exemplificar, vamos retornar ao exemplo da conta corrente a partir da tabela a seguir. SET SALDO = SALDO – 200 WHERE NRCC = 1000 UPDATE CONTA SET SALDO = SALDO + 200 3 4 5 6 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 11/91 NRCC Nome CPF Saldo 1000 J. Silva 123 500,00 1001 A. Barros 143 500,00 1002 J. Silva 123 200,00 1003 S. Sales 223 500,00 Tabela: Conta corrente. Sidney Nicolau Venturi Filho Observe a sequência do exemplo a seguir: Leitura do saldo Imagine que o cliente Antônio Barros, conta 1001, vai ao caixa eletrônico para fazer um saque de R$200,00. Para poder efetivar o saque, o sistema então lê o saldo de R$500,00. T2 bloqueada Neste mesmo instante, ocorre o débito automático de uma conta de R$300,00 do cliente, para poder efetivar o pagamento o sistema quer fazer a leitura do saldo da conta, porém agora a transação 1 (saque) bloqueou o acesso ao saldo da conta o 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 12/91 que impede a transação 2 (pagamento da conta) de continuar até que T1 faça COMMIT ou ROLLBACK. Atualização pelo saque T1 continua, atualiza o saldo, comanda COMMIT e o saque é efetivado. Leitura do saldo pelo pagamento Como T1 fez commit, a leitura do saldo por T2 foi liberada e a transação pode continuar. Atualização pelo pagamento T2 agora leu o saldo, após a atualização de T1 (R$300,00), faz o pagamento da conta, atualiza o saldo e executa o commit. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 13/91 Resultado Como resultado, temos que o cliente possuía um saldo inicial de R$500,00, teve um conta de R$300,00 paga, sacou R$200,00, portanto, utilizou R$500,00. Ao final, ficou com um saldo de R$0,00, ou seja, as transações concorrentes produziram o resultado correto devido ao isolamento das transações. Durabilidade Esta propriedade estabelece que depois de a transação ser completada com sucesso, as mudanças que ela faz no banco de dados persistem, até mesmo se houver falha no sistema. Se o usuário que fez a transferência do exemplo acima recebeu uma informação que ela foi realizada, o SGBD deve garantir que, mesmo se ocorrer uma falha, como crash de servidor, quando ele for restaurado, a transferência deve constar ainda nos dados. Para tal, arquivos de LOG e mecanismos de recuperação são utilizados. Tipos de transações em banco de dados distribuídos Uma solicitação de usuário em um banco de dados distribuídos pode gerar dois tipos de transações: Transações locais Definidas como aquelas que acessam apenas dados no próprio banco local onde se originou. Transações globais Definidas como aquelas que afetam mais de um banco local. Cada um desses tipos exige uma forma de controle diferente. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 14/91 Mecanismos de controle de transações locais Neste vídeo, apresentaremos formas de reconhecer os mecanismos de controle de transações locais, também falaremos sobre o gerenciamento de transação e arquivos de LOG. Controle de transações em bancos locais O controle do processamento de uma transação local é praticamente igual ao de uma transação em um banco centralizado. A imagem a seguir mostra a arquitetura de um SGBD local: Arquitetura do SGBD. A partir da imagem apresentada, podemos destacar: Responsável por: O otimizador de consulta 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 15/91 Receber o comando. Determinar o seu plano de execução. Executar a consulta. Inserir, remover e modificar as linhas e tabelas da base de dados. Alterar os metadados. Responsável pela execução da transação e controle da concorrência. Responsável por tratar os problemas decorrentes de uma falha no SGBD. Gerenciador de transação As consultas e demais ações no banco de dados são agrupadas em transações, que, como vimos, devem ser executadas de forma atômica e durável, ou seja, o efeito de uma transação que foi completada deve ser preservado mesmo após uma falha do sistema. Em seu trabalho, o gerenciador de transação cria um identificador para cada transação (TId) e o armazena em suas tabelas de controle. Além disso, ele lida com o fato de que várias transações podem estar sendo executadas de forma concorrente no banco de dados e, eventualmente, tentarem acessar o mesmo item de dado, podendo gerar graves problemas na consistência do banco. Arquivo de LOG Todo SGBD tem um arquivo de dados onde as informações são armazenadas. A cada comando SQL submetido, o SGBD abre implicitamente uma transação, caso esse comando não esteja incluído dentro de uma transação explicitamente requisitada pelo usuário ao SGBD. Desta forma, todo comando SQL está implicitamente ou explicitamente dentro de uma transação. Quando alguma informação é requisitada por uma transação, uma cópia dela é criada na memória. Cada operação da transação vai sendo então O gerenciador de transação O mecanismo de recuperação 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 16/91 gravada no buffer do log existente na memória, como ilustra a tabela a seguir: Identificador Transação TId Linha Anterior Transação Linha Posterior Transação Operação Realização Transação T1 0 1 INICIAR T1 1 4 ESCREVER T2 0 9 INICIAR T1 2 5 ESCREVER T1 4 8 LER T3 0 7 LER Tabela: Extrato de entradas do arquivo de LOG. Sidney Nicolau Venturi Filho Mecanismos de controle de transações globais Neste vídeo, você vai conhecer os mecanismos de controle de transações em bancos globais. Controle de transações em bancos globais 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 17/91 Quando falamos de controle de transações globais, a arquitetura utilizada para o controle deve ser expandida para incluir o controle da consulta global. Veja a imagem a seguir: Arquitetura de controle de transações globais. A partir da imagem, podemos observar que surgem então dois novos módulos: Responsável por montar o plano de execução da consulta, quando esta envolve o acesso a mais de um banco local. Realiza o controle da transação global sendo responsável por: Iniciar a execução da transação. Dividir a transação em subtransações e distribuí-las aos bancos de dados locais que as devem executar. Coordenar o término da transação global, que pode resultar em ser efetivada ou abortada em todos os sites envolvidos. Uma questão que surge neste ponto é: existe então um SGBDD para controlar as transações globais? Na realidade não, as funções associadas ao banco global (imagem anterior) são realizadas pelo SGBD local que primeiro recebeu a consulta global e que assume as tarefas de otimização e coordenação Otimizador de consulta global Coordenador de transação global 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 18/91 globais. Na implementação da arquitetura, cada SGBD local possui uma cópia do banco de dados global que engloba o diretório de dados global (DDG) e o coordenador de transações global. Diretório de dados global Contém descrições dos objetos lógicos e físicos e dos mapeamentos entre estes. Ao receber uma consulta e identificá-la como uma transação global, o SGBD local cria seu plano de execução, atribuium TId, define as subtransações e as envia aos demais sites para execução. Durante o processamento da transação global, cada site executa a sua subtransação usando os mesmos mecanismos de execução de uma transação global e, ao produzir o resultado, o retorna ao site de origem. Após todos os sites terem produzido o resultado, o coordenador de transação global irá definir se os efeitos da transação devem ser efetivados ou desfeitos (abortados). Protocolos para con�rmação de transação distribuída Neste vídeo, apresentaremos formas de identificar os protocolos para confirmação de transação distribuída, bem como os tipos de protocolos, a confirmação em duas ases e a confirmação em três fases. Tipos de protocolos Para decidir que uma transação dever ser efetivada ou abortada, o coordenador deve levar em conta se: 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 19/91 Todos os bancos locais tiveram sucesso na execução de suas subtransações. O usuário que fez a solicitação não comandou ROLLBACK. Não ocorreu uma falha em algum ponto do sistema. Para obter os dados necessários para tomar a sua decisão, o coordenador de transação pode utilizar um dos seguintes de protocolos de confirmação (COMMIT): Confirmação em duas fases. Confirmação em três fases. Con�rmação em duas fases O protocolo de confirmação em duas fases (two phase commit – 2PC) é muito simples e elegante, garantindo a atomicidade de transações distribuídas. Ele estende os efeitos das ações locais de confirmação atômica para transações distribuídas, insistindo que todos os sites envolvidos na execução de uma transação distribuída concordem em confirmar a transação antes que seus efeitos se tornem permanentes. Apresentaremos o funcionamento do protocolo, observe, inicialmente, a fase 1: O coordenador, que corresponde ao SGBD que iniciou a transação, avisa aos bancos locais sobre a intenção de realizar o commit 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 20/91 enviando uma mensagem “prepare” e registra em seu log o início da efetivação. Se o banco local estiver em condições de fazer o commit, ele anota no seu log que está “pronto” para commit e envia um voto de commit para o coordenador. Se o banco local não estiver em condições, ele registra no seu log “Abort” e envia um voto para abortar ao coordenador. Agora, apresentaremos a fase 2: Após receber os votos de todos os bancos locais envolvidos na transação, o coordenador apura o resultado. Se houver pelo menos um voto “abort”, o coordenador envia a todos os bancos locais a mensagem para abortar, caso contrário, se todos os votos forem favoráveis, ele envia uma mensagem commit. E, em ambos os casos, o coordenador anota em seu log a decisão tomada. Os bancos locais, ao receberem a decisão do coordenador, adotam a ação indicada e fazem as anotações em seu log e após terminar notifica o coordenador que conclui a operação. A operação do protocolo 2PC entre um coordenador e um participante na ausência de falhas está representada na imagem a seguir, na quak os círculos indicam os estados, os estados terminais são representados por círculos concêntricos e as linhas tracejadas indicam as mensagens entre o coordenador e os participantes. Protocolo de Confirmação em duas fases. Quanto ao funcionamento do protocolo, devemos notar que a regra de confirmação global estabelece que é necessário que todos os participantes votem pela confirmação, se apenas um votar para abortar a transação será cancelada. Alguns pontos importantes sobre o protocolo 2PC que podem ser observados na imagem anterior são: 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 21/91 Con�rmação em três fases A confirmação em três fases (three phase commit – 3PC) surgiu como uma evolução do 2PC para lidar com o fato de que, se o coordenador falhar antes da confirmação, todos os bancos locais ficarão bloqueados O 2PC permite que um participante aborte unilateralmente uma transação até que tenha registrado um voto afirmativo. Uma vez que um participante vota para confirmar ou abortar uma transação, ele não pode mudar seu voto. Enquanto um participante está no estado Pronto, ele pode se mover para abortar a transação ou confirmá-la, dependendo da natureza da mensagem do coordenador. A decisão de cancelamento é tomada pelo coordenador de acordo com a regra de confirmação global. O coordenador e participante entram em determinados estados em que precisam aguardar mensagens um do outro. Para garantir que eles possam sair desses estados e terminar, são usados temporizadores. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 22/91 à espera da recuperação do site de origem, o que diminui o desempenho. Para lidar com isso, este protocolo realiza uma primeira fase igual a fase 1 do 2PC, uma segunda fase com novas operações e uma terceira fase igual à fase 2 do 2PC. Em resumo: Fase 1 Igual à fase1 do 2PC. Fase 2 Acrescida pelo 3PC. Fase 3 Igual à fase2 do 2PC. Podemos notar então que o início e final dos dois protocolos são iguais. A diferença é a “nova” fase2. Vamos ver em detalhes como ela funciona. Após o coordenador receber os votos dos bancos locais, final da fase 1, ele envia uma mensagem “Preparar para Confirmar” a todos os sites envolvidos na transação. Os bancos locais ao receberem a mensagem anotam em seu log preparar para commit e informam ao coordenador que estão prontos para confirmar. O coordenador ao receber a mensagem de todos os envolvidos para a fase 3, essa será igual à fase 2 do 2PC. Este protocolo, apesar de resolver alguns problemas do 2PC, não foi implementado na prática devido ao aumento da latência, gerado por uma maior troca de mensagens entre os sites. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 23/91 Falta pouco para atingir seus objetivos. Vamos praticar alguns conceitos? Questão 1 Considere que um usuário emitiu os seguintes comandos: BEGIN TRANSACTION UPDATE CONTA SET SALDO = SALDO - 300 WHERE NRCC = 1002; COMMIT; BEGIN TRANSACTION UPDATE CONTA SET SALDO = SALDO + 300 WHERE NRCC = 1001; COMMIT; Sabendo-se que o usuário deseja fazer uma transferência entre as contas, podemos concluir que, quanto às propriedades das transações, se o segundo UPDATE não for efetivado Parabéns! A alternativa C está correta. Embora pareça que a atomicidade foi violada, essa foi uma opção do usuário ao não envolver os dois comandos em uma única transação. Mas a consistência dos dados foi violada, já que o valor total final não corresponde à transferência que se desejava realizar. A todas as propriedades foram atendidas. B a atomicidade foi violada. C a consistência foi violada. D o isolamento foi violado. E a durabilidade foi violada. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 24/91 Questão 2 Considere o seguinte cenário: Um site denominado 5 recebeu uma transação que envolvia o acesso aos sites 2, 3 e 4.Após definir as subtransações, enviou-as aos sites que deveriam as executar. Após a mensagem “prepare” enviada pelo coordenador de transação, os sites responderam: Site 2 COMMIT; Site 3 ABORT; Site 4 COMMIT. Sabendo-se que o sistema utiliza a confirmação em duas fases, podemos afirmar que: O coordenador irá enviar a mensagem commit para os sites Porque: Na confirmação em duas fases, quando a maioria vota pelo commit, ele é realizado. Quantos às afirmativas, selecione a opção correta. Parabéns! A alternativa E está correta. A primeira afirmativa está errada porque no protocolode confirmação em duas fases basta um site votar pelo abort para a transação ser abortada. A segunda é falsa porque, apesar de alguns A As duas afirmações estão corretas e a segunda justifica a primeira. B As duas afirmações estão corretas e a segunda não justifica a primeira. C A primeira afirmação é correta e a segunda falsa. D A primeira afirmação é falsa e a segunda correta. E As duas afirmações são falsas. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 25/91 protocolos de confirmação levarem em conta a maioria, no 2PC basta um votar abort para que todos tenham que abortar a transação. 2 - Controle de concorrência em banco de dados distribuídos Ao �nal deste módulo, você será capaz de analisar as técnicas de controle de concorrência. Transações concorrentes Neste vídeo, apresentaremos o que são transações correntes e quais são principais problemas gerados por essas transações. O que são transações concorrentes? Observe a seguir, o conteúdo de uma tabela de contas correntes de um banco. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 26/91 NRCC Nome CPF Saldo 1000 J. Silva 123 500,00 1001 A. Barros 143 500,00 1002 J. Silva 123 200,00 1003 S. Sales 223 500,00 Tabela: Conta corrente. Sidney Nicolau Venturi Filho Observe a sequência do exemplo a seguir: Leitura do saldo Agora, imagine que o cliente Antônio Barros, conta 1001, vai a ao caixa eletrônico para fazer um saque de R$200,00. Para poder efetivar o saque, o sistema lê o saldo de R$500,00. Leitura do saldo com outra operação simultânea Neste mesmo instante, ocorre o débito automático de uma conta de R$300,00 do cliente, para poder efetivar o pagamento o sistema faz a leitura do saldo da conta, R$500,00 realiza o pagamento e atualiza o saldo para R$200,00. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 27/91 Atualização pelo débito da conta Em seguida, acontece a atualização do sistema pelo débito da conta. Atualização pelo saque Após atualização, o saque é efetivado e o saldo da conta atualizado. Resultado Como resultado, temos que o cliente possuía um saldo inicial de R$500,00, teve um conta de R300,00 paga, sacou R$200,00. Portanto utilizou R$500,00. Mesmo assim, ficou com um saldo de R300,00. Devido ao fato de terem ocorrido duas operações em paralelo em cima do mesmo conjunto de dados, o que caracteriza o acesso concorrente, a 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 28/91 aplicação de controle da conta corrente não soube lidar corretamente com a situação. A anomalia aconteceu afetando o isolamento entre as transações e a sua consistência. Como se pode lidar com esta situação então? Por meio dos mecanismos de controle de acesso concorrente do SGBD. Problemas gerador por transações concorrentes Quando ocorre acesso concorrente, alguns problemas podem acontecer pela intercalação inadequada das operações nas transações, como: Problema da atualização perdida; Problema da atualização temporária ou leitura suja (dirty read); Problema da leitura que não pode ser repetida (nonrepeatable read); Problema da leitura fantasma (phantom read); Problema do resumo incorreto. Vamos conhecer com mais detalhes esses problemas. Problema da atualização perdida Este problema ocorre quando duas transações acessam o mesmo conjunto de dados de forma concorrente e têm suas operações intercaladas, o que faz com que gerem um resultado incorreto. Observe, na tabela a seguir, um conjunto de operações realizado por duas transações (T1 e T2 de forma intercalada). Assumindo que os valores de X é 90 e de N é 3, vejamos como ocorrem as operações. Instante Operação A B C X 1 T1 lê X para A 90 90 2 T1 subtraí N de A 87 90 3 T2 lê X para C 87 90 90 4 T2 soma n a C 87 93 90 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 29/91 Instante Operação A B C X 5 T1 sobrescreve X com A 87 92 87 6 T2 lê sobrescreve X com C 87 90 92 93 Tabela: Atualização perdida. Sidney Nicolau Venturi Filho Ainda sobre a tabela anteriormente apresentada, note que X tinha o valor inicial de 90, T1 subtrai 3 dele e T2 somou 3. Então, ao final, ele deveria continuar com 90, mas seu valor final é 93. Isso aconteceu porque a atualização feita por T1 no instante 5 foi perdida por T2 que continuou utilizando o valor original de X. Problema da atualização temporária ou leitura suja (dirty read) Este problema ocorre quando uma transação atualiza um dado e outra transação o lê antes que a primeira tenha sido efetivada (commit). Se a transação da atualização falhar ou for desfeita (rollback), a transação que leu irá operar com dados incorretos. Observe, na tabela a seguir, um conjunto de operações realizado por duas transações (T1 e T2 de forma intercalada). Assumindo que os valores de X é 90 e de N é 3, como ocorrem as operações? Instante Operação A B X T1 1 T1 lê X para A 90 90 Leia (x,a); 2 T1 subtraí N de A 87 90 a: = a - n; 3 T1 sobrescreve X com A 87 87 Escreva (a,x) 4 T2 lê X para B 87 87 87 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 30/91 Instante Operação A B X T1 5 T2 soma n a C 87 90 87 Escreva (a,x) 6 T2 sobrescreve X com B 87 90 90 7 T1 Falha 87 90 90 Falha Tabela: Leitura suja. Sidney Nicolau Venturi Filho O que está errado? Como T1 falhou, a atualização de X para 87 não deveria ter ocorrido. Portanto, T2 deveria ter utilizado o valor 90 e não 87 e o resultado deveria ser 93. Problema da leitura que não pode ser repetida (nonrepeatable read) Este problema ocorre quando uma transação lê o mesmo dado duas vezes e o seu valor é alterado por outra transação entre as leituras. Observe, na tabela a seguir, um conjunto de operações realizado por duas transações (T1 e T2 de forma intercalada). Assumindo que os valores de X é 90 e de N é 3, vamos ver como as operações ocorrem. Instante Operação A C X T1 1 T1 lê X para A 90 90 Leia (x, a) ; 2 T1 subtraí N de A 87 90 a: = a – n; 3 T2 lê X para C 87 90 90 4 T1 sobrescreve X com A 87 90 87 Escreva (a, x) 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 31/91 Instante Operação A C X T1 5 T2 lê X para C 87 87 87 Tabela: Leitura não repetível. Sidney Nicolau Venturi Filho Quando T2 fez a primeira leitura de X, obteve o valor 90 no instante 3, porém, quando fez uma nova leitura, obteve um valor diferente no instante 5, que foi 87. Isso ocorreu devido ao fato de, no instante 4, T1 ter atualizado o valor de X. Problema da leitura fantasma (phantom read) Este problema ocorre quando uma transação, ao ler dados lidos anteriormente, descobre que o conjunto de linhas retornados é diferente do anterior, pois, entre as leituras, outra transação inseriu novas linhas na tabela. Apesar de parecida com a leitura não repetível, a diferença reside no fato de os dados anteriormente lidos não terem mudado, apenas foram acrescentados novos dados. Considere a seguinte tabela de alunos. apresentada na imagem a seguir: Uma transação T1 deseja listar os alunos do curso 1 e obteria o seguinte resultado demonstrado na imagem a seguir: 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 32/91 Após a execução deste comando, uma transação T2 insere duas novas linhas na tabela apresentada na imagem a seguir: Alterando os dados da tabela que fica com as seguintes linhas, demonstrada na imagem a seguir: T1 ao repetira consulta anterior, obterá o seguinte resultado: 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 33/91 Note que apareceu uma nova linha no resultado, a linha 3 que não existia antes. Esta é a linha fantasma. Problema do resumo incorreto Este problema ocorre quando uma transação está realizando uma agregação de dados e os valores com os quais ela vai operar são alterados durante a sumarização. Observe, na tabela a seguir, um conjunto de operações realizado por duas transações (T1 e T3 de forma intercalada). Assumindo que os valores de X e Y são iguais a 90 e o valor de N é 3, vejamos como ocorrem as operações. Tabela: Resumo incorreto. Sidney Nicolau Venturi Filho O que está errado? Como o valor inicial de X era 90 e foi reduzido para 87 por T1 no instante 4, quando T3 o lê atualiza o somador com este valor. A seguir faz a leitura de Y que ainda não foi atualizado e, portanto, acrescenta 90 ao somador totalizando 177. Entretanto, como o valor final de X é 87 e de Y, 93, o resultado da soma deveria ser 180. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 34/91 Controle de concorrência Neste vídeo, apresentaremos formas de identificar os principais controles de concorrência, particularmente nas execuções serial e intercalada. Princípio de funcionamento do controle de concorrência A ideia básica do controle de concorrência é produzir um resultado consistente, ou seja, produzir o mesmo resultado que seria obtido se as transações tivessem sido executadas uma depois da outra. Então, uma escala de execução de transações sempre será correta se o seu resultado corresponder ao obtido por uma execução sequencial delas. Cabe ao SGBD definir o plano de escalonamento, ou seja, a forma como as transações serão executadas. Execução serial Neste tipo de plano, as transações são escalonadas para serem executadas uma depois da outra. Apresentaremos dois exemplos de execução serial, veja o primeiro a seguir: T1 T2 Leia (x,a); a: = a - 50; Escreva (a,x); Leia (y,b); b: = b + 50; Escreva (b,y); 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 35/91 T1 T2 Leia (x,c); temp: = a * 0,1; c: = c - temp; Escreva (c,x); Leia (y,d); d: = d + temp; Escreva (d,y) Tabela: Exemplo 01, execução serial. Sidney Nicolau Venturi Filho Veja na tabela a seguir o segundo exemplo de execução serial: T1 T2 Leia(x,c); temp:= a * 0,1; c:=c-temp; Escreva(c,x); Leia(y,d); d:= d + temp; Escreva(d,y) Leia(x,a); a:=a-50; Escreva(a,x); 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 36/91 T1 T2 Leia(y,b); b:=b+50; Escreva(b,y); Tabela: Exemplo 02, execução serial. Sidney Nicolau Venturi Filho Vamos analisar os dois escalonamentos passo a passo, para tal vamos considerar os valores de X e Y como sendo 120 e 90, respectivamente. vejamos na tabela a seguir o escalonamento 01: Tabela: Escalonamento 01. Sidney Nicolau Venturi Filho Note que o valor final de X é 63 e de Y é 154. Vamos agora ver o escalonamento 02: Tabela: Escalonamento 02. Sidney Nicolau Venturi Filho 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 37/91 Note que o valor final de X é 58 e de Y é 149, diferentes, portanto, do valores obtidos ao final do escalonamento 01. Isso significa que um deles está errado? Não! Os dois estão corretos, qualquer resultado obtido por uma execução serial de transações sempre está correto. Execução intercalada Quando as operações das transações são executadas de forma intercalada, a execução intercalada estará correta sempre que o seu resultado corresponder ao resultado de uma execução sequencial. Vamos voltar às duas transações do exemplo anterior, veja a tabela a seguir: T1 T2 Leia (x,a); Leia (x,c); a: = a-50; temp: = a * 0,1; Escreva(a,x); c: = c-temp; Leia (y,b); Escreva (c,x); b: = b + 50; Leia (y,d); Escreva(b,y); d: = d + temp; Escreva (d,y) Tabela: Transações de exemplo. Sidney Nicolau Venturi Filho Para análise dos escalonamentos intercalados, vamos considerar os valores de X e Y, 120 e 90, respectivamente. A tabela a seguir mostra o primeiro escalonamento intercalado: T1 T2 Leia(x,a); a:=a-50; 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 38/91 T1 T2 Escreva(a,x); Leia(x,c); temp:= a * 0,1; c:=c-temp; Escreva(c,x); Leia(y,b); b:=b+50; Escreva(b,y); Leia(y,d); d:= d + temp; Escreva(d,y) Tabela: Escalonamento intercalado. Sidney Nicolau Venturi Filho Vejamos a seguir o resultado do escalonamento intercalado 01: Tabela: Escalonamento intercalado 01. Sidney Nicolau Venturi Filho Note que o valor final de X é 63 e de Y é 154, que corresponde a um dos resultados obtidos na execução serial. Portanto, este escalonamento 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 39/91 está correto. Vamos agora ver o escalonamento 02: T1 T2 Leia(x,a); a:=a-50; Leia(x,c); temp:= a * 0,1; c:=c-temp; Escreva(c,x); Escreva(a,x); Leia(y,b); b:=b+50; Escreva(b,y); Leia(y,d); d:= d + temp; Escreva(d,y) Tabela: Escalonamento intercalado. Sidney Nicolau Venturi Filho Vejamos a seguir o resultado do escalonamento intercalado 02: 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 40/91 Tabela: Escalonamento intercalado 02.Sidney Nicolau Venturi Filho Note que o valor final de X é 70 e o valor de Y é 154, o que não corresponde a qualquer dos resultados obtidos na execução serial (X 63 e Y 154 ou X 58 e Y 149). O escalonamento, portanto, está errado e não deve ser utilizado. O erro ocorre no passo 3, quando T2 lê o valor de X antes dele ser atualizado por T1 (atualização perdida). As questões que surgem então são: “como uma execução intercalada pode produzir resultados inconsistentes, deveria sempre ser utilizado um escalonamento serial?” Em um mundo perfeito sim, mas no mundo real a execução serial tem o indesejável efeito de aumentar o tempo de resposta se diversas transações desejam acessar o mesmo conjunto de dados, já que somente uma delas será executada de cada vez. Por este motivo, os SGBDs utilizam escalonamento intercalado, mas somente aqueles que produzem resultados equivalentes a uma execução serial. Controle de concorrencia nas transações locais Neste vídeo, apresentaremos os principais tipos de controles de concorrência nas transações locais e falaremos sobre o protocolo baseado em bloqueio (controle pessimista). 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 41/91 Tipos de controle de concorrencia Como as transações locais apenas acessam dados em seu próprio banco, o seu controle é em tudo similar ao de bancos centralizados. Então, para que o isolamento e a consistência sejam de fato possíveis, é necessário que o SGBD realize o controle de concorrência entre as transações locais podendo, para isso, utilizar basicamente dois métodos de controle distintos, que são: Partem da premissa de que as transações conflitam entre si na maioria das execuções e estabelecem protocolos para o acesso exclusivo aos dados pelas operações. Baseiam-se na premissa de que a maioria das transações não possui operações conflitantes entre si, possibilitando livre acesso aos valores dos objetos de dados. Ao final da execução de uma transação – ao receber o comando de commit – fazem a avaliação da história produzida. Caso o SGBD verifique a violaçãodo isolamento, a transação é desfeita. Cada um desses métodos pode ser implementado com a utilização de diversos protocolos, conforme apresentaremos a seguir, veja as diferenças: Métodos pessimistas Métodos otimistas 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 42/91 Métodos de controle pessimista Bloqueio Timestamp Híbrido Métodos de controle otimista Timestamp Multiversão Confira esses métodos em formato de gráfico a seguir: Tipos de Protocolos de métodos de controle de concorrência. Desses protocolos, os mais utilizados são: Bloqueio Para o controle pessimista. Timestamp Para o controle otimista. Protocolo baseado em bloqueio (controle pessimista) Este é o tipo de protocolo que mais nos interessa em Bancos de Dados Distribuídos. Neste tipo de protocolo, quando uma transação T1 acessa um item de dado, nenhuma outra pode acessá-lo. Para que isso aconteça, T1 deve colocar um bloqueio (lock) no item de dado que deseja manipular. Aliás, toda transação deve obrigatoriamente colocar um bloqueio em um item de dados antes de o acessar, seja para leitura ou para escrita. Esta solicitação é feita ao controlador de concorrência. A transação só poderá executar qualquer operação depois que o controlador de concorrência conceder (grant) o bloqueio do dado para a transação. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 43/91 Existem basicamente dois tipos de bloqueio: Quando uma transação T1 deseja apenas ler um dado. Este bloqueio permite que outras transações possam ler o dado, mas não possam alterá-lo. Quando uma transação T1 deseja alterar um dado. Este bloqueio não permite que outras transações possam ler ou alterar o dado bloqueado. A tabela a seguir mostra a compatibilidade entre os tipos de bloqueio: Compartilhado Exclusivo Compartilhado Compatível Incompatível Exclusivo Incompatível Incompatível Tabela: Compatibilidade dos tipos de bloqueio. Sidney Nicolau Venturi Filho Podemos ver, na tabela a seguir, que duas transações diferentes podem colocar um bloqueio compartilhado no mesmo item de dados, já que apenas irão fazer leitura. Porém, se uma transação colocar um bloqueio exclusivo, pois deseja escrever, as outras ficarão sem acesso ao item até que ele seja liberado. INSTANTE T1 T2 Controle de Concorrência 1 Lock-X(b); 2 Grant-X(b,T1) 3 Leia(b); Compartilhado (S) Exclusivo (X) 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 44/91 INSTANTE T1 T2 Controle de Concorrência 4 b:=b-50; 5 Escreva(b) 6 Lock- S(a); Grant-S(a,T2) 7 Leia(a); 8 Lock- S(b); 9 Lock-S(a); 10 Grant-S(a,T2) 11 Leia(a); Tabela: Transações concorrentes. Sidney Nicolau Venturi Filho Vamos analisar a execução passo a passo. Veja a tabela a seguir: Instante Operação Observação 1 T1 solicita bloqueio exclusivo sobre B 2 T1 ganha acesso exclusivo sobre B B bloqueado para outras transações 3 T1 lê B Para a memória 4 T1 subtrai 50 de B Na memória 5 T1 atualiza B no banco Grava a atualização no disco 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 45/91 Instante Operação Observação 6 T2 solicita bloqueio compartilhado sobre A 7 T2 ganha acesso compartilhado sobre A A bloqueado para transações de escrita e liberado para bloqueios de leitura 8 T2 lê A Para a memória 9 T2 solicita bloqueio compartilhado sobre B Como B tem um bloqueio exclusivo T2 bloqueia 10 T1 solicita bloqueio compartilhado sobre A Como A tem um bloqueio compartilhado T1 também coloca o bloqueio e ganha acesso a A. A tem dois bloqueios compartilhados agora, um de T1 e um de T2 11 T1 lê A Para a memória Tabela: Passo a passo. Sidney Nicolau Venturi Filho Note que durante a execução: No instante 9, T2 bloqueou, pois, apesar de desejar apenas ler, T1 colocou um bloqueio exclusivo. No instante 10, T1 pediu um bloqueio compartilhado em A, como ele é compatível com o bloqueio compartilhado colocado por T2 no instante 7, T1 pode prosseguir. Deadlock O uso de bloqueios pode provocar o Deadlock. Mas, o que vem a ser isso? Imagine que temos duas transações sendo executadas de forma concorrente, como mostrado na tabela a seguir: 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 46/91 Instante T1 T2 Controle de Concorrência 1 Lock-X(b); 2 Grant-X(b,T1) 3 Leia(b); 4 b:=b-50; 5 Escreva(b); 6 Lock- S(a); 7 Grant-S(a,T2) 8 Leia(a); 9 Lock- S(b); 10 Lock-X(b); 11 Situação de Deadlock Tabela: Transações concorrentes. Sidney Nicolau Venturi Filho Vamos analisar a execução passo a passo, veja a tabela a seguir: Instante Operação Observação 1 T1 solicita bloqueio exclusivo sobre B 2 T1 ganha acesso exclusivo sobre B B bloqueado para outras transações 3 T1 lê B Para a memória 4 T1 subtrai 50 de B Na memória 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 47/91 Instante Operação Observação 5 T1 atualiza B no banco Grava a atualização no disco 6 T2 solicita bloqueio compartilhado sobre A 7 T2 ganha acesso compartilhado sobre A A bloqueado para transações de escrita e liberado para bloqueios de leitura 8 T2 lê A Para a memória 9 T2 solicita bloqueio compartilhado sobre B Como B tem um bloqueio exclusivo T2 bloqueia 10 T1 solicita bloqueio exclusivo sobre A Como B tem um bloqueio compartilhado T1 bloqueia 11 DEADLOCK Nem T1 nem T2 podem prosseguir Tabela: Passo a passo. Sidney Nicolau Venturi Filho Como resolver o Deadlock? Existem basicamente duas estratégias: Prevenção Impedir que o deadlock aconteça realizando um controle maior da concessão de bloqueios. Detecção Ao detectar que o deadlock ocorreu, resolver o conflito. Como realizar a prevenção é muito custosa em termos de processamento, pois a maioria dos SGBDs utiliza a detecção e ao 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 48/91 identificá-la realizam ROLLBACK do lock colocado por uma das transações, isso libera a outra pra prosseguir. Controle de concorrência em transações globais Neste vídeo apresentaremos, a partir de uma visão geral do controle de concorrência de bancos de dados distribuídos, os principais controles de concorrência nas transações globais. Além disso, vamos falar sobre o protocolo de bloqueio em duas fases. Visão geral do controle de concorrência em bancos de dados distribuídos Em comparação com um banco centralizado, um banco de dados distribuído apresenta novos desafios para o controle de concorrência, como: Lidar com múltiplas réplicas das tabelas, que exige que o controle de concorrência mantenha a consistência do banco global. Falha de sites individuais, o que acarreta o problema de uma transação ser bem-sucedida em um deles e não poder ser completada em outro. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 49/91 Protocolo de bloqueio em duas fases (two phase lock - 2PL) No controle de transação distribuída, é utilizada uma variação do protocolo de bloqueio denominado protocolo de bloqueio em duas fases, que facilita a obtenção da serialização das transações. Este protocolo exige que todas as operações de bloqueio, tanto de leitura como de gravação, sejam efetivadas antes que a primeira operação de desbloqueio ocorra. Podemos dividir a execução da transação em duas fases: Expansão ou crescimento Novos bloqueios em itens podem ser obtidos, mas nenhum liberado. Encolhimento Os bloqueiosexistentes são liberados, mas nenhum novo pode ser obtido. Observe a tabela a seguir, na qual são exibidas duas transações que não seguem o protocolo de duas fases, porque o operação Lock-X(X) segue a operação unlock(Y) em T1 e, de maneira semelhante, a operação Lock- Falha dos links de comunicação, que pode tornar um dos bancos locais inacessíveis. Confirmação distribuída, o que exige a adoção do commit em duas fases ou em três fases. Ocorrência de Deadlock distribuído, o que exige a extensão das técnicas de prevenção e detecção para este ambiente bem mais complexo. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 50/91 X (Y) segue a operação unlock (X ) em T2 e cuja execução serial produz os resultados apresentados. T1 T2 Lock-S(Y) Lock-S(X) Leia(Y) Leia(X) Lock-X(X) Unlock(X) Unlock(Y) Lock-X(Y) Leia(X) Leia(Y) X: = X + Y Y: = Y+X Escreva (X) Escreva (Y) Unlock (X) Unlock (Y) Valores Iniciais X = 20 Y = 30 Execução serial T1 e depois T2 X = 50 Y = 80 Execução serial T2 e depois T1 X=70 Y = 50 Tabela: Transações que não seguem o 2PL. Sidney Nicolau Venturi Filho Note que, como T1 e T2 não seguem o protocolo de duas fases, elas podem produzir uma sequência de execução que não produz o resultado equivalente a um serial, veja na tabela a seguir e considere que X = 50 e y = 50 (Não serializável): T1 T2 Lock-S(Y) Leia(Y) Unlock(Y) Lock-S(X) Leia(X) 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 51/91 T1 T2 Unlock(X) Lock-X(Y) Leia(Y) Y:=Y+X Escreva(Y) Lock-X(X) Unlock(Y) Leia(X) X:=X + Y Escreva(X) Unlock(X) Tabela: Transações que não seguem o 2PL. Sidney Nicolau Venturi Filho Para forçar o 2PL, as transações devem ser reescritas como exibido na tabela a seguir, o que garante a serialização. T1 T2 Lock-S(Y) Lock-S(X) Leia(Y) Leia(X) Lock-X(X) Lock-X(Y) Unlock(Y) Unlock(X) Leia(X) Leia(Y) X: = X + Y Y: = Y+X Escreva (X) Escreva (Y) 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 52/91 T1 T2 Unlock (X) Unlock (Y) Tabela: Transações que seguem o 2PL. Sidney Nicolau Venturi Filho Controle de concorrência distribuído baseado em uma cópia distinguida de um item de dados Para lidar com dados replicados, foram propostas extensões das técnicas utilizadas em bancos centralizados, passando pela designação de uma das réplicas dos dados como sendo a responsável pelo controle de concorrência (cópia distinguida). Esta técnica pode assumir métodos diferentes para a escolha da cópia distinguida, como: Site primário Site primário com site de backup Cópia primária Site primário Um único site é designado para realizar a coordenação para todos os itens do banco de dados global, ficando responsável, portanto, pelo controle de todos os bloqueios, recebendo todas as solicitações de acesso dos outros sites. Neste caso, se todas as transações seguirem o protocolo de bloqueio em duas fases, a serialização está garantida. Sua grande vantagem é ser uma extensão simples da técnica centralizada sendo relativamente simples. Suas desvantagens são: Como todas as solicitações de bloqueio são dirigidas a um único site, ele pode ficar sobrecarregado, causando um gargalo no sistema. Uma falha do site principal paralisa o sistema, pois toda a informação de bloqueio é mantida nesse site. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 53/91 Site primário com site de backup Para enfrentar a segunda desvantagem citada, um segundo site é designado como backup e mantém cópia das informações de bloqueio, o que permite que em caso de falha do primário ele assuma. Técnica de cópia primária O controle de concorrência é distribuído por vários sites, cada um controlando um conjunto distinto de itens de dados. Quando um dos sites de controle falha, todas as transações que estão acessando os dados que ele controla ficam prejudicadas. Para melhorar a confiabilidade, podem ser utilizados sites de backup. Controle de concorrência distribuído baseado em votação Neste tipo de controle de concorrência, a solicitação de bloqueio de um item de dados é enviada para todos os bancos que possuem uma réplica. Cada site então realiza o seu controle, podendo conceder ou negar o bloqueio. Se a transação que solicitou o bloqueio, o recebe da maioria dos sites, ela mantém o bloqueio e informa a todos que o obteve. Caso contrário, se a transação não recebe o bloqueio da maioria dos sites, ela cancela sua solicitação e informa a todos que não realizará o bloqueio. Falta pouco para atingir seus objetivos. Vamos praticar alguns conceitos? Questão 1 A imagem a seguir mostra o retorno de uma consulta realizada por um usuário. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 54/91 Logo a seguir, dentro da mesma transação, ele repetiu a consulta e obteve o seguinte resultado: A respeito dos resultados obtidos, podemos afirmar que ocorreu a anomalia de transação denominada A atualização perdida. B atualização temporária ou leitura suja (dirty read). C leitura que não pode ser repetida (nonrepeatable read). D leitura fantasma (phantom read). 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 55/91 Parabéns! A alternativa B está correta. Os resultados mostram que, entre duas leituras do mesmo item de dados realizados por uma mesma transação, o seu valor foi modificado por outra transação, o que caracteriza leitura suja. Questão 2 A tabela a seguir mostra as operações de duas transações T1 e T2. Quanto à serialização das duas transações, podemos afirmar que: Elas seguem o protocolo de bloqueio em duas fases. Porque No protocolo 2PL todos os bloqueios devem ocorrer antes da primeira liberação. Quantos às afirmativas, assinale a alternativa correta. E resumo incorreto. A As duas afirmações estão corretas e a segunda justifica a primeira. B As duas afirmações estão corretas e a segunda não justifica a primeira. C A primeira afirmação é correta e a segunda falsa. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 56/91 Parabéns! A alternativa D está correta. A primeira afirmativa é falsa porque, apesar de T1 seguir o protocolo, T2 não segue, já que ocorre o desbloqueio de X antes do bloqueio de Y. Já a segunda afirmativa é verdadeira, pois realizar todos os bloqueios antes do primeiro desbloqueio é a característica do protocolo de bloqueio em duas fases. 3 - Consultas distribuídas Ao �nal deste módulo, você será capaz de identi�car as formas de otimização de consultas em bancos de dados distribuídos. Consultas locais Neste vídeo, falaremos sobre a otimização e execução de comandos locais e as estratégias para otimização de consultas. D A primeira afirmação é falsa e a segunda correta. E As duas afirmações são falsas. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 57/91 Otimização e execução de comandos locais A otimização e execução de uma consulta local é, em sua totalidade, similar à execução de consultas em um banco de dados centralizado. Ao receber uma consulta, um SGDB gera um plano de execução para o seu processamento, seguindo para isso um processo de várias etapas, confira a seguir: Análise sintática A sintaxe da consulta é verificada e os erros são apontados. Análise semântica ou validação É checada a existência de tabelas, visões e colunas, bem como são realizadas verificações de tipos dos atributos e dados utilizadosna consulta. Reescrita de consulta É realizada a reescrita do SQL em uma representação interna derivada da álgebra relacional. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 58/91 Estratégias para otimização de consultas Inicialmente, o SGBD executa a otimização heurística de consultas, que compreende transformar a consulta SQL em uma expressão algébrica. A partir da expressão algébrica, é realizada a reordenação de suas operações visando obter uma expressão mais eficiente. Baseando-se na expressão otimizada, o SGBD pode definir os métodos de acesso e os algoritmos adequados para a execução da consulta. Após a otimização heurística, o SGBD irá analisar os metadados e escolher os algoritmos para acesso físico ao conteúdo dos arquivos. Neste ponto, ele pode utilizar duas abordagens: O otimizador utiliza um conjunto de heurísticas para transformar a consulta em um plano de acesso. Por exemplo, o otimizador poderia sempre escolher utilizar um índice que esteja disponível sobre uma coluna. O otimizador consulta os metadados sobre as tabelas do banco de dados para determinar qual o plano mais eficiente, mais Otimização da consulta Por meio s de um conjunto de regras, o SGBD manipula a sua representação interna e procura a estratégia de execução considerada mais eficiente. Geração de código De posse do plano otimizado, ocorrem as chamadas ao processador de execução do SGBD. Otimização por regras Otimização por custo 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 59/91 rápido, para execução da consulta. Ao término da otimização, é gerado o plano de execução, que determina as operações a serem realizadas, métodos de acesso, algoritmos a ser utilizados, índices etc. Métodos de acesso aos dados de tabelas Estes métodos determinam a forma como as linhas de uma tabela serão acessadas. Vejamos dois tipos de varreduras: Comumente chamada de Full Table Scan (Varredura Completa de Tabela), compreende a leitura sequencial de todas as linhas de uma tabela. Geralmente, é a opção feita pelo otimizador quando precisa selecionar a totalidade das linhas da tabela, não existindo outro método de acesso adequado ou devido a utilização de alguns operadores como IS NULL, LIKE, <> etc. A determinação das linhas a serem acessadas é realizada a partir de um ou mais índices aplicados as colunas da tabela. Este método é muito eficiente na recuperação de um subconjunto restrito dos dados. Operações realizadas em consultas Além de definir o método de acesso, o plano de execução especifica as operações a serem realizadas. Veja a seguir: Ordenação Operação básica para diversas outras operações físicas, sendo implementada pela cláusula ORDER BY. Se o conjunto a ser ordenado não cabe em memória, esta operação pode ser muito Varreduras sequenciais Varredura indexada 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 60/91 cara. Pode ser utilizada em DISTINCT, UNION, INTERSECTION, JOIN e outras cláusulas. Eliminação de duplicatas e agregações Estas operações são implementadas, em geral, através de uma ordenação (sorting) para realizar o agrupamento (GROUP BY). Após a ordenação pelo critério de agregação, o resultado é varrido e a operação é computada. Também é possível resolver este tipo de operação através de técnicas de hash. Operações que atuam em mais de uma tabela Para permitir a integração de dados de mais de uma tabela, o plano de execução pode utilizar operações de conjunto (união, interseção e diferença) e junções. Consultas globais Neste vídeo, falaremos sobre o processamento de uma consulta global e apresentaremos o esquema de distribuição, as estratégias de solução, o cálculo do custo e o processamento de consulta distribuído, usando semijunção. Passos para o processamento de consultas globais O processamento de consultas globais ocorre em vários passos, vejamos a seguir: Mapeamento da consulta 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 61/91 A consulta de entrada é analisada sintática e semanticamente, com base no esquema conceitual global do banco de dados e, a seguir, transformada em algum tipo de representação algébrica interna, similar ao que foi visto no processamento do banco local, sem levar em conta como os dados estão distribuídos. Da expressão algébrica gerada no mapeamento, o SGBDD localiza os metadados da distribuição do banco de dados, determinando quais fragmentos possuem os itens de dados necessários, bem como verificando se eles estão ou não replicados e em quais sites residem, mapeando a consulta distribuída no esquema global para consultas separadas para cada um dos fragmentos/copias dos itens de dados. O objetivo deste passo é encontrar uma estratégia de execução que seja a mais eficiente possível, ou seja, de menor custo, utilizando o tempo como unidade de medida. Para o cálculo do custo, são levados em conta além dos tempos de CPU e E/S, os de comunicação, que nos BDD são, inclusive, mais significativos. Após a análise dos custos, é gerado o plano de execução distribuído para o banco global. O SGBD global envia aos diversos bancos locais a parte do plano que lhes cabe executar. Os bancos locais, então, definem o seu plano de execução local, produzem o resultado e o retornam ao site de origem. Vejamos as etapas do processamento de consultas globais esquematizado na imagem a seguir: Localização de dados Otimização global da consulta Execução distribuída 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 62/91 Processamento de consultas globais. Exemplo de processamento de consulta global Para este exemplo, considere o esquema conceitual global apresentado na imagem a seguir: Esquema conceitual global. Considere agora que foi submetida a seguinte consulta no site 5: SQL Esquema de distribuição No esquema de distribuição, foi realizada a fragmentação horizontal das tabelas, mantendo a disjunção da seguinte forma: Site 1 T b l EMPREGADO d i d EMP1 SELECT NOME FROM EMPREGADO E INNER JOIN ALOCPROJ A ON E.MAT = A.MAT WHERE CARGO = ‘GERENTE’ 1 2 3 4 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 63/91 Estrategias de solução Duas estratégias podem ser utilizadas para realizar a consulta. Vejamos inicialmente a estratégia A: Transferir ALOCPROJ1 do site 3 para o site 1 onde será realizada a junção com EMPREGADO1. Transferir ALOCPROJ2 do site 4 para o site 2 onde será realizada a junção com EMPREGADO2. Transferir os resultados, R1 e R2, das junções dos sites 1 e 2 para o site 5 que as combinaria e produziria a resposta final. Tabela EMPREGADO denominada EMP1 com as linhas dos empregados cuja matrícula seja menor ou igual a que 10. Site 2 Tabela EMPREGADO denominada EMP2 com as linhas dos empregados cuja matrícula seja maior que 10. Site 3 Tabela ALOCPROJ denominada ALOCPROJ1 com as linhas dos empregados cuja matrícula seja menor ou igual a que 200. Site 4 Tabela ALOCPROJ denominada ALOCPROJ2 com as linhas dos empregados cuja matrícula seja maior que 200. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 64/91 Vejamos na imagem a seguir o esquema gráfico que representa este processo. Esquema gráfico do processo da estratégia A. Vejamos a seguir a estratégia B: Transferir EMPREGADO1 do site 1 para o site 5. Transferir EMPREGADO2 do site 2 para o site 5. Transferir ALOCPROJ1 do site 3 para o site 5. TransferirALOCPROJ2 do site 4 para o site 5. Realizar as junções e demais operações no site 5 e produzir a resposta final. Vejamos na imagem a seguir o esquema gráfico que representa o processo da estratégia B: Esquema gráfico do processo da estratégia B. Cálculo do custo Para o cálculo do custo, vamos assumir os seguintes dados: EMPREGADO1 possui 200 linhas. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 65/91 EMPREGADO2 possui 200 linhas. ALOCPROJ1 possui 500 linhas com 10 linhas de gerentes. ALOCPROJ2 possui 500 linhas com 10 linhas de gerentes; O custo de acesso a uma linha é de 1 unidade de custo (UC). O custo de transferência de uma linha entre os sites são 10 unidades de custo (UC). Vejamos a seguir os custos da estratégia A e da estratégia B: 1. Transferir ALOCPROJ1 para site 1 requer 5000 UC. 2. Transferir ALOCPROJ2 para site 2 requer 5000 UC. 3. Filtrar ALOCPROJ1 no site 1 requer 500 UC. 4. Filtrar ALOCPROJ2 no site 2 requer 500 UC. 5. Produzir R1 no site 1 requer 200 UC no processamento da junção. �. Produzir R2 no site 1 requer 200 UC no processamento da junção. 7. Transferir R1 para o site 5 requer 100 UC. �. Transferir R2 para o site 5 requer 100 UC. 9. Produzir o resultado no site 5 requer 20 UC. Custo Total: 11620 UC 1. Transferir EMPREGADO1 do site 1 para o site 5 requer 2000 UC. 2. Transferir EMPREGADO2 do site 2 para o site 5 requer 2000 UC. 3. Transferir ALOCPROJ1 do site 3 para site t requer 5000 UC. 4. Transferir ALOCPROJ2 do site 4 para site 5 requer 5000 UC. 5. Filtrar ALOCPROJ1 no site 5 requer 10 UC. �. Filtrar ALOCPROJ2 no site 5 requer 10 UC. 7. Realizar a junção entre EMPREGADO e as filtragens de ALOLCPROJ no site 5 e produzir o resultado requer 8000 UC. Custo da estratégia A Custo da estratégia B 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 66/91 Custo Total: 22020 UC Podemos notar que a estratégia A é melhor que a B, apesar de ainda possuir um custo relativamente alto. Será que podemos melhor? Sim, utilizando semijunção. Processamento de consulta distribuído usando sem�unção O objetivo de executar semijunção é reduzir o número de linhas a ser transferido de um site para outro. A ideia envolve transferir de um site A para o site B apenas a coluna envolvida na condição de junção. No site b, a junção é realizada entre a coluna recebida e seus itens de dados, sendo o resultado então enviado para o site que produzirá o resultado. Voltando ao exemplo de cálculo de custo, vamos ver a estratégia C. Produzir no site 3 o conjunto com a matrícula dos gerentes (G1). Produzir no site 4 o conjunto com a matrícula dos Gerente (G2). Transferir G1 do site 3 para o site 1, onde será realizada a junção com EMPREGADO1. Transferir G2 do site 4 para o site 2, onde será realizada a junção com EMPREGADO2. Transferir os resultados, R1 e R2, das junções dos sites 1 e 2 para o site 5 que as combinaria e produziria a resposta final. Vejamos na imagem a seguir o esquema gráfico que representa o processo da estratégia C: Esquema gráfico do processo da estratégia C. Vejamos a seguir o cálculo de custo da estratégia C: 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 67/91 1. Produzir G1 no site 1 requer 500 UC. 2. Produzir G2 no site 2 requer 500 UC. 3. Transferir G1 para site 1 requer 100 UC. 4. Transferir G2 para site 2 requer 100 UC. 5. Produzir R1 no site 1 requer 200 UC no processamento da junção. �. Produzir R2 no site 1 requer 200 UC no processamento da junção. 7. Transferir R1 para o site 5 requer 100 UC. �. Transferir R2 para o site 5 requer 100 UC. 9. Produzir o resultado no site 5 requer 20 UC. Custo Total: 1820 UC Observe como o uso da semijunção diminui muito o custo com a transferência de dados entre os sites. Falta pouco para atingir seus objetivos. Vamos praticar alguns conceitos? Questão 1 Durante o processo de execução e otimização de comandos de consultas locais, temos uma etapa que verifica se as tabelas e colunas referenciadas existem no banco de dados. Esta etapa é denominada Custo da estratégia C A análise sintática. B análise semântica. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 68/91 Parabéns! A alternativa B está correta. A análise semântica, também denominada validação, verifica se o comando referência objetos e itens de dados que existem no banco de dados bem como faz a verificação de tipos. Questão 2 Quanto ao processamento de consultas globais na fase de mapeamento da consulta, podemos afirmar que: A análise sintática e semântica é realizada de forma similar ao da execução em um banco centralizado Porque Nesta fase, ocorre o acesso ao esquema conceitual global sem levar em conta como a distribuição foi realizada. Quanto às afirmativas, assinale a alternativa correta. C reescrita de consulta. D otimização da consulta. E geração de código. A As duas afirmações estão corretas e a segunda justifica a primeira. B As duas afirmações estão corretas e a segunda não justifica a primeira. C A primeira afirmação é correta e a segunda falsa. D A primeira afirmação é falsa e a segunda correta. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 69/91 Parabéns! A alternativa A está correta. As duas afirmativas estão corretas, pois uma consulta global do ponto de vista do banco global é como se fosse nele centralizada, somente na etapa seguinte localização dos dados é avaliada a distribuição dos dados. 4 - SQL em consultas distribuídas Ao �nal deste módulo, você será capaz de aplicar comandos utilizando SQL em consultas distribuídas. Acessando bancos de dados remotos Neste vídeo, apresentaremos as formas de acesso a um banco de dados remoto e falaremos também sobre a ligação de banco de dados. Formas de acesso a banco de dados remotos E As duas afirmações são falsas. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 70/91 Em SBDD, que implementam a transparência de distribuição, um usuário realiza a sua consulta como se estivesse utilizando um banco de dados centralizado, considerando apenas o esquema conceitual global do banco, o que não acontece quando a transparência de distribuição não é implementada no sistema. Neste último caso, que inclusive é bem comum, o usuário necessita especificar, em sua consulta, qual o fragmento ou cópia da tabela que deseja acessar. Para permitir o acesso ao fragmento ou à cópia remota, é necessário que o SGBD no site de origem consiga referenciar o servidor remoto. Para isso, existe uma ferramenta nos SGBD denominada ligação de banco de dados. Ligação de banco de dados A ligação de banco de dados permite que, a partir do canal de comunicação da rede de computadores que interliga o servidor local e o servidor remoto, seja criada uma ligação lógica entre os bancos residentes. Veja o esquema da imagem a seguir: Ligação entre servidores e entre banco de dados. Cada fabricante de SGBD implementa de uma forma diferente este tipo de ligação como, por exemplo: Oracle Permite a criação de database link, objeto de banco de dados, que identifica e estabelece as informações de conexão para um banco de dados remoto. SQL Server Utiliza os servidores vinculados (linked server) que permitem enviar uma instrução SQL em uma instância do SQL Server, que retorna dados de outras instâncias do SQL Server. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 71/91 PostgreSQL Utiliza a extensão dblink que fornece uma série de funçõesque permitem acessar e manipular dados em outro servidor. Para exemplificar o uso, vamos nos concentrar no dblink do PostgreSQL. Descrição do ambiente dos servidores Neste vídeo, apresentaremos formas de configurar um servidor local e um remoto. Os servidores No ambiente que vamos utilizar para os exemplos, possuímos dois servidores PostgreSQL denominados SERVIDOR1 e SERVIDOR2. O Servidor1 está localizado em uma máquina local e rodando também o PGAdmin, possuindo o banco de dados do escritório central de um representante comercial. O Servidor2 está em uma máquina virtual que é acessada pela rede local, e cujo IP é 192.168.5.189, porta 5432, e que está sendo administrado pelo PGAdmin localizado na máquina do Servidor1 e possui o banco de dados da sucursal do representante comercial (imagem a seguir). 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 72/91 PGAdmin do ambiente de exemplo. Nos bancos central e sucursal possuímos a tabela FARMACIA, que foi fragmentada horizontalmente, e cada fragmento possui os dados das farmácias atendidas por aquele escritório. O comando de criação da tabela farmácia é: SQL CREATE TABLE FARMACIA ( CNPJ CHAR(14) PRIMARY KEY, RAZAO_SOCIAL VARCHAR(50), TELEFONE VARCHAR(13)) 1 2 3 4 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 73/91 Para criar as tabelas basta submeter os comandos aos dois servidores, veja na imagem a seguir: Submissão de comandos aos dois servidores. Agora vamos colocar dados nas tabelas, para isso emita no banco CENTRAL os seguintes comandos: SQL Confira o resultado na imagem a seguir: Comandos para inserir dados na tabela através do banco central. Para colocar dados na sucursal, os comandos são: SQL INSERT INTO FARMACIA (CNPJ, RAZAOSOCIAL, TELEFONE) V INSERT INTO FARMACIA VALUES (‘23456789000136’, ‘FARM COMMIT; 1 2 3 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 74/91 Confira o resultado na imagem a seguir: Comandos para inserir dados na sucursal. DBLINK POSTGRESQL Neste vídeo, explicaremos o que é Dblink e como habilitá-lo em um banco de dados. O que é o dblink? O dblink é uma extensão do servidor PostgreSQL que suporta conexões com outros bancos de dados, no mesmo ou em outro servidor, a partir da conexão em uso pelo usuário. A extensão possui um conjunto de funções, cada uma com a sua própria finalidade, veja a lista com cada uma delas a seguir de acordo com a documentação de PostgreSQL: dblink_connect: Abre uma conexão persiste com um banco de dados remoto. INSERT INTO FARMACIA (CNPJ, RAZAOSOCIAL, TELEFONE) VINSERT INTO FARMACIA VALUES (‘45678923000136’, ‘FARM COMMIT; 12 3 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 75/91 dblink_connect_u: Abre uma conexão persistente com um banco de dados remoto, de forma insegura. dblink_disconnect: Fecha uma conexão persistente com um banco de dados remoto. dblink: Executa uma consulta em um banco de dados remoto. dblink_exec: Executa um comando em um banco de dados remoto. dblink_open: Abre um cursor em um banco de dados remoto. dblink_fetch: Retorna linhas de um cursor aberto em um banco de dados remoto. dblink_close: Fecha um cursor em um banco de dados remoto. dblink_get_connections: Retorna os nomes de todas as conexões dblink nomeadas abertas. dblink_error_message: Obtém a última mensagem de erro na conexão nomeada. dblink_send_query: Envia uma consulta assíncrona para um banco de dados remoto. dblink_is_busy: Verifica se a conexão está ocupada com uma consulta assíncrona. dblink_get_notify: Recupera notificações assíncrónas em uma conexão. dblink_get_result: Obtém um resultado de consulta assíncrona. dblink_cancel_query: Cancela qualquer consulta ativa na conexão nomeada. dblink_get_pkey: Retorna as posições e nomes de campo dos campos de chave primária de uma relação. dblink_build_sql_insert: Constrói uma instrução INSERT usando uma tupla local, substituindo os valores do campo de chave primária por valores alternativos fornecidos. dblink_build_sql_delete: Constrói uma instrução DELETE usando valores fornecidos para valores de campo de chave primária. dblink_build_sql_update: Contrói uma instrução UPDATE usando uma tupla local, substituindo os valores do campo de chave primária por valores alternativos fornecidos. Habilitando o dblink em um banco de dados 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 76/91 Para que se possa utilizar o dblink, é necessário que a extensão seja criada, pois a extensão não existe em um banco de dados por padrão, conforme pode ser observado no banco CENTRAL na aba extensões no PGAdmin. Captura de tela do programa PGAdmin para criação da extensão no uso do dblink. Existem duas formas para criar a extensão, a primeira consiste na ferramenta de consulta SQL conectada ao banco CENTRAL, escrever o comando CREATE EXTENSION DBLINK e mandar executar, veja na imagem a seguir: Comando para criação da extenção no programa PGAdmin A segunda forma é utilizando a interface gráfica do PGAdmin, e clicar com o botão direito em EXTENSION no banco CENTRAL e selecionar CREATE EXTENSION, veja o processo nas imagens a seguir: 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 77/91 Segunda forma para criação da extensão no programa PGAdmim. Etapa para salvar a extensão no programa PGAdmin. O efeito das duas é criar a extensão no banco, vejamos. 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 78/91 Captura de tala do programa PGAdmim após criação das extensão. Funções Dblink Neste vídeo, apresentaremos as principais funções do DBLink, entre elas, DBLINK_CONNECT, DBLINK_EXEC e DBLINK_DISCONNECT. DBLINK A função DBLINK é a função mais básica da extensão e executa uma consulta (geralmente um SELECT, mas pode ser qualquer instrução SQL que retorne linhas) em um banco de dados remoto. Ela possui a seguinte sintaxe básica: Dblink (string de conexão ou nome da conexão, comando select) retorna registro. Onde: Nome da conexão 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 79/91 Nome da conexão criada com dblink_connect. Informações sobre como realizar a conexão com os seguintes itens: host= endereço IP do servidor. port= porta de rede do servidor normalmente 5432. dbname= nome do banco que deseja acessar. user= usuário de conexão. password= senha do usuário de conexão. A consulta SQL que você deseja executar no banco de dados remoto. Quando dois argumentos são fornecidos, o primeiro é procurado primeiro, ou seja, o nome de uma conexão persistente criada com dblink_connect; se encontrado, o comando é executado nessa conexão. Se não for encontrado, o primeiro argumento é tratado como uma string de conexão e a conexão indicada é feita apenas durante este comando. Vejamos um exemplo de uso. Considere que, estando conectado no banco central do Servidor1, se deseje retornar à razão social das farmácias atendidas pela sucursal. Os dados de conexão são: host=192.168.5.189 port=5432 user=postgres password=senha dbname=SUCURSAL O comando SQL para produzir o que se deseja é: SQL String de conexão Comando Select 21/11/2023, 07:42 Implementação de Banco de Dados Distribuídos https://stecine.azureedge.net/repositorio/00212ti/07592/index.html# 80/91 Observe que antes do nome da tabela FARMACIA, consta o esquema PUBLIC onde ela reside, sem isso o comando pode
Compartilhar