La concurrència en bases de dades es refereix a la capacitat de múltiples usuaris o processos per accedir i modificar dades simultàniament. Gestionar la concurrència de manera efectiva és crucial per mantenir la integritat de les dades i assegurar un rendiment òptim. En aquest tema, explorarem els conceptes clau relacionats amb la concurrència, els problemes comuns que poden sorgir i les tècniques per gestionar-los.

Conceptes clau

  1. Bloquejos (Locks)

Els bloquejos són mecanismes que controlen l'accés simultani a les dades per part de múltiples transaccions. Hi ha diferents tipus de bloquejos:

  • Bloquejos exclusius (Exclusive Locks): Permeten que només una transacció accedeixi a les dades.
  • Bloquejos compartits (Shared Locks): Permeten que múltiples transaccions llegeixin les dades, però no les modifiquin.

  1. Nivells d'aïllament (Isolation Levels)

Els nivells d'aïllament defineixen el grau en què les operacions d'una transacció són visibles per altres transaccions. Els nivells d'aïllament més comuns són:

  • Read Uncommitted: Les transaccions poden veure dades no confirmades per altres transaccions.
  • Read Committed: Les transaccions només poden veure dades confirmades.
  • Repeatable Read: Les dades llegides per una transacció no poden ser modificades per altres transaccions fins que la primera transacció es confirmi.
  • Serializable: Les transaccions es processen de manera que sembla que s'executen seqüencialment.

  1. Problemes de concurrència

Els problemes comuns de concurrència inclouen:

  • Lectures brutes (Dirty Reads): Una transacció llegeix dades no confirmades per una altra transacció.
  • Lectures no repetibles (Non-repeatable Reads): Una transacció llegeix les mateixes dades dues vegades i obté resultats diferents.
  • Lectures fantasmes (Phantom Reads): Una transacció llegeix un conjunt de dades que canvia amb una altra transacció.

Tècniques per gestionar la concurrència

  1. Utilitzar nivells d'aïllament adequats

Seleccionar el nivell d'aïllament adequat per a les transaccions pot ajudar a mitigar els problemes de concurrència. Per exemple, utilitzar Read Committed pot evitar lectures brutes, mentre que Serializable pot evitar lectures no repetibles i lectures fantasmes.

  1. Implementar bloquejos adequats

Els bloquejos poden ser utilitzats per controlar l'accés a les dades. Per exemple, utilitzar bloquejos exclusius per a operacions d'escriptura i bloquejos compartits per a operacions de lectura.

  1. Control de versions multiversió (MVCC)

MVCC és una tècnica que permet que múltiples versions d'una fila coexisteixin. Això permet que les transaccions llegeixin una versió consistent de les dades sense bloquejar altres transaccions.

  1. Gestió de temps d'espera i reintents

Configurar temps d'espera per als bloquejos i implementar mecanismes de reintents pot ajudar a gestionar situacions on les transaccions es bloquegen mútuament.

Exemple pràctic

A continuació, es mostra un exemple de com utilitzar nivells d'aïllament en SQL:

-- Establir el nivell d'aïllament a Read Committed
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- Iniciar una transacció
BEGIN TRANSACTION;

-- Operacions de lectura i escriptura
SELECT * FROM clients WHERE client_id = 1;
UPDATE clients SET balance = balance - 100 WHERE client_id = 1;

-- Confirmar la transacció
COMMIT;

Exercici pràctic

Exercici

  1. Crea dues transaccions que intentin actualitzar el mateix registre simultàniament.
  2. Configura diferents nivells d'aïllament per a cada transacció i observa el comportament.

Solució

-- Transacció 1
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;
UPDATE clients SET balance = balance - 100 WHERE client_id = 1;
WAITFOR DELAY '00:00:05'; -- Simula un retard
COMMIT;

-- Transacció 2
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;
UPDATE clients SET balance = balance + 100 WHERE client_id = 1;
COMMIT;

Conclusió

Gestionar la concurrència és essencial per mantenir la integritat de les dades i assegurar un rendiment òptim en bases de dades SQL. Comprendre els conceptes de bloquejos, nivells d'aïllament i tècniques com MVCC pot ajudar a mitigar els problemes comuns de concurrència. Practicar amb exemples i exercicis és una manera efectiva de consolidar aquests coneixements.

Curs de SQL

Mòdul 1: Introducció a SQL

Mòdul 2: Consultes bàsiques de SQL

Mòdul 3: Treballar amb múltiples taules

Mòdul 4: Filtratge avançat de dades

Mòdul 5: Manipulació de dades

Mòdul 6: Funcions avançades de SQL

Mòdul 7: Subconsultes i consultes niades

Mòdul 8: Índexs i optimització del rendiment

Mòdul 9: Transaccions i concurrència

Mòdul 10: Temes avançats

Mòdul 11: SQL en la pràctica

Mòdul 12: Projecte final

© Copyright 2024. Tots els drets reservats