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
- 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.
- 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.
- 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
- 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.
- 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.
- 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.
- 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
- Crea dues transaccions que intentin actualitzar el mateix registre simultàniament.
- 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
- Utilitzar LIKE per a coincidències de patrons
- Operadors IN i BETWEEN
- Valors NULL i IS NULL
- Agrupar dades amb GROUP BY
- Clàusula HAVING
Mòdul 5: Manipulació de dades
Mòdul 6: Funcions avançades de SQL
Mòdul 7: Subconsultes i consultes niades
- Introducció a les subconsultes
- Subconsultes correlacionades
- EXISTS i NOT EXISTS
- Utilitzar subconsultes en les clàusules SELECT, FROM i WHERE
Mòdul 8: Índexs i optimització del rendiment
- Comprendre els índexs
- Crear i gestionar índexs
- Tècniques d'optimització de consultes
- Analitzar el rendiment de les consultes
Mòdul 9: Transaccions i concurrència
- Introducció a les transaccions
- Propietats ACID
- Instruccions de control de transaccions
- Gestionar la concurrència
Mòdul 10: Temes avançats
Mòdul 11: SQL en la pràctica
- Casos d'ús del món real
- Millors pràctiques
- SQL per a l'anàlisi de dades
- SQL en el desenvolupament web