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
- Concurrencia: La capacidad de una base de datos para permitir múltiples transacciones al mismo tiempo.
- Problemas de concurrencia: Situaciones que pueden surgir cuando varias transacciones acceden y modifican los mismos datos simultáneamente.
- Bloqueos (Locks): Mecanismos para controlar el acceso concurrente a los datos.
- 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
- 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.
- 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.
- 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:
- Bloqueo compartido (Shared Lock): Permite que múltiples transacciones lean un recurso, pero no permite que ninguna lo modifique.
- Bloqueo exclusivo (Exclusive Lock): Permite que solo una transacción lea y modifique un recurso.
- 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:
- Read Uncommitted: Permite lecturas sucias.
- Read Committed: Evita lecturas sucias.
- Repeatable Read: Evita lecturas sucias y no repetibles.
- 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
- Configura el nivel de aislamiento a
Serializable
. - Inicia una transacción y selecciona datos de una tabla.
- 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
- Instrucción SELECT
- Filtrando datos con WHERE
- Ordenando datos con ORDER BY
- Limitando resultados con LIMIT
Módulo 3: Trabajando con múltiples tablas
Módulo 4: Filtrado avanzado de datos
- Usando LIKE para coincidencia de patrones
- Operadores IN y BETWEEN
- Valores NULL y IS NULL
- Agregando datos con GROUP BY
- Cláusula HAVING
Módulo 5: Manipulación de datos
Módulo 6: Funciones avanzadas de SQL
Módulo 7: Subconsultas y consultas anidadas
- Introducción a subconsultas
- Subconsultas correlacionadas
- EXISTS y NOT EXISTS
- Usando subconsultas en cláusulas SELECT, FROM y WHERE
Módulo 8: Índices y optimización de rendimiento
- Entendiendo los índices
- Creación y gestión de índices
- Técnicas de optimización de consultas
- Análisis del rendimiento de consultas
Módulo 9: Transacciones y concurrencia
- Introducción a las transacciones
- Propiedades ACID
- Instrucciones de control de transacciones
- Manejo de concurrencia