Sobes.tech
Middle

O que são bloqueios no contexto do trabalho com bancos de dados e por que são necessários?

sobes.tech IA

Resposta da IA

Os bloqueios na base de dados são mecanismos utilizados para gerir o acesso de múltiplos utilizadores ou processos aos mesmos dados ao mesmo tempo. Eles evitam conflitos e mantêm a integridade dos dados em ambientes concorrentes.

São necessários para resolver os seguintes problemas:

  • Condições de corrida (Race Conditions): Situação em que a ordem de execução das operações influencia o resultado final. Os bloqueios garantem que as operações sejam realizadas de forma sequencial ou numa ordem segura para os dados.
  • Leituras inconsistentes (Inconsistent Reads): Um processo lê dados enquanto outro os modifica, o que pode levar a obter um estado intermédio ou incompleto dos dados. Os bloqueios podem prevenir isso.
  • Atualizações perdidas (Lost Updates): Dois processos leem os mesmos dados, os modificam e depois guardam. A última gravação sobrescreve as alterações do primeiro, perdendo-as. Os bloqueios ajudam a evitar a perda de alterações.
  • Leituras fantasmas (Phantom Reads): Dentro de uma mesma transação, uma consulta repetida devolve um conjunto diferente de linhas porque outro processo adicionou ou eliminou linhas que cumprem as condições da consulta.

Tipos principais de bloqueios:

  • Partilhado (Shared/Read Lock): Permite que várias transações leiam os mesmos dados simultaneamente. Não permite bloqueios de escrita nesses dados.
  • Exclusivo (Exclusive/Write Lock): Concede acesso monopólio aos dados. Apenas uma transação pode ter um bloqueio exclusivo em certos dados num dado momento. Não permite bloqueios de leitura nem de escrita nesses dados.

Os bloqueios podem ser aplicados em diferentes níveis:

  • Nível de base de dados: Toda a base de dados é bloqueada. Raramente utilizado.
  • Nível de tabela: Toda a tabela é bloqueada. Menos granular, pode reduzir a concorrência.
  • Nível de linha: Uma linha específica é bloqueada. Mais granular, suporta alta concorrência, mas pode requerer mais recursos.
  • Nível de página: Uma página de dados (unidade de armazenamento no SGBD que contém várias linhas) é bloqueada. É um compromisso entre bloquear toda a tabela e uma linha.

A implementação dos bloqueios depende do SGBD específico (por exemplo, InnoDB e MyISAM no MySQL têm estratégias diferentes, PostgreSQL, etc.). Em PHP, muitas vezes usam-se transações para gerir os bloqueios.

-- Exemplo de uso de transação e bloqueio em SQL
START TRANSACTION;

SELECT balance FROM accounts WHERE account_id = 123 FOR UPDATE;
-- FOR UPDATE impõe um bloqueio exclusivo na linha selecionada

UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;

COMMIT;
-- Ou ROLLBACK em caso de erro