En este módulo, aprenderemos sobre la concurrencia en bases de datos, un aspecto crucial para mantener la integridad y consistencia de los datos cuando múltiples usuarios acceden y modifican la base de datos simultáneamente. Exploraremos los problemas comunes de concurrencia y las técnicas para manejarlos.

Conceptos Clave

  1. Concurrencia: La capacidad de una base de datos para permitir múltiples transacciones al mismo tiempo.
  2. Problemas de concurrencia: Situaciones que pueden surgir cuando varias transacciones acceden y modifican los mismos datos simultáneamente.
  3. Bloqueos (Locks): Mecanismos para controlar el acceso concurrente a los datos.
  4. Niveles de aislamiento: Configuraciones que determinan cómo y cuándo los cambios realizados por una transacción son visibles para otras transacciones.

Problemas Comunes de Concurrencia

  1. Lectura sucia (Dirty Read): Ocurre cuando una transacción lee datos que han sido modificados por otra transacción pero aún no han sido confirmados.
  2. Lectura no repetible (Non-repeatable Read): Ocurre cuando una transacción lee los mismos datos más de una vez y obtiene resultados diferentes porque otra transacción ha modificado esos datos entre lecturas.
  3. Lectura fantasma (Phantom Read): Ocurre cuando una transacción ejecuta una consulta que devuelve un conjunto de filas que cambia si la misma consulta se ejecuta nuevamente debido a inserciones o eliminaciones realizadas por otra transacción.

Bloqueos (Locks)

Los bloqueos son una técnica fundamental para manejar la concurrencia. Existen varios tipos de bloqueos:

  1. Bloqueo compartido (Shared Lock): Permite que múltiples transacciones lean un recurso, pero no permite que ninguna lo modifique.
  2. Bloqueo exclusivo (Exclusive Lock): Permite que solo una transacción lea y modifique un recurso.
  3. Bloqueo de actualización (Update Lock): Permite que una transacción lea un recurso y lo bloquee para futuras actualizaciones.

Ejemplo de Bloqueo

-- Transacción 1
BEGIN TRANSACTION;
SELECT * FROM cuentas WHERE id = 1 WITH (XLOCK);

-- Transacción 2
BEGIN TRANSACTION;
SELECT * FROM cuentas WHERE id = 1 WITH (NOLOCK);

En este ejemplo, la Transacción 1 bloquea la fila con id = 1 para actualización, mientras que la Transacción 2 intenta leer la misma fila sin esperar el bloqueo.

Niveles de Aislamiento

Los niveles de aislamiento determinan el grado de visibilidad de los cambios realizados por una transacción a otras transacciones. Los niveles de aislamiento estándar son:

  1. Read Uncommitted: Permite lecturas sucias.
  2. Read Committed: Evita lecturas sucias.
  3. Repeatable Read: Evita lecturas sucias y no repetibles.
  4. Serializable: Evita lecturas sucias, no repetibles y fantasmas.

Ejemplo de Niveles de Aislamiento

-- Configurar nivel de aislamiento a Read Committed
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

BEGIN TRANSACTION;
SELECT * FROM cuentas WHERE id = 1;
-- Realizar operaciones
COMMIT;

En este ejemplo, configuramos el nivel de aislamiento a Read Committed, lo que evita lecturas sucias.

Ejercicio Práctico

Ejercicio 1: Configuración de Niveles de Aislamiento

  1. Configura el nivel de aislamiento a Serializable.
  2. Inicia una transacción y selecciona datos de una tabla.
  3. En otra sesión, intenta modificar los mismos datos y observa el comportamiento.

Solución

-- Sesión 1
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION;
SELECT * FROM cuentas WHERE id = 1;
-- Mantener la transacción abierta

-- Sesión 2
BEGIN TRANSACTION;
UPDATE cuentas SET saldo = saldo + 100 WHERE id = 1;
-- Esta operación esperará hasta que la transacción en Sesión 1 se complete

Resumen

En esta sección, hemos cubierto los conceptos clave de la concurrencia en bases de datos, incluyendo los problemas comunes de concurrencia, los tipos de bloqueos y los niveles de aislamiento. Estos conceptos son fundamentales para garantizar la integridad y consistencia de los datos en entornos multiusuario. En el siguiente módulo, exploraremos temas avanzados como procedimientos almacenados y triggers.

Curso de SQL

Módulo 1: Introducción a SQL

Módulo 2: Consultas básicas de SQL

Módulo 3: Trabajando con múltiples tablas

Módulo 4: Filtrado avanzado de datos

Módulo 5: Manipulación de datos

Módulo 6: Funciones avanzadas de SQL

Módulo 7: Subconsultas y consultas anidadas

Módulo 8: Índices y optimización de rendimiento

Módulo 9: Transacciones y concurrencia

Módulo 10: Temas avanzados

Módulo 11: SQL en la práctica

Módulo 12: Proyecto final

© Copyright 2024. Todos los derechos reservados