Gestión Avanzada de Transacciones SQL: Concurrencia y Niveles de Aislamiento en SGBD

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 4,07 KB

Gestión de Transacciones en Sistemas Gestores de Bases de Datos (SGBD)

Generalmente, cuando se conecta un cliente a un SGBD, por defecto está activado el modo AUTOCOMMIT ON, lo que significa que cada comando SQL que se ejecute será considerado como una transacción independiente. Para activar las transacciones de múltiples sentencias, es necesario establecer el modo AUTOCOMMIT OFF. A partir de ese momento, todos los comandos SQL enviados al SGBD deberán finalizarse con una sentencia COMMIT o una sentencia ROLLBACK. De este modo, se asegura la integridad de los datos a un nivel más alto. Muchos SGBD requieren de una sentencia START TRANSACTION o START WORK para comenzar una transacción, mientras que otros lo hacen de forma implícita al establecer el modo AUTOCOMMIT OFF.

Inicio y Finalización de Transacciones

Formas de Iniciar una Transacción:

  • SET AUTOCOMMIT = OFF; # o
  • START TRANSACTION; # o
  • BEGIN WORK;

Formas de Finalizar una Transacción:

  • COMMIT WORK; # Acepta los cambios.
  • ROLLBACK WORK; # Cancela los cambios.

Ejemplo Práctico de Transacción SQL

SET AUTOCOMMIT OFF;

# Se actualiza el stock
UPDATE Productos SET Stock=Stock-2 WHERE CodigoProducto='AAAF102';

# Se inserta la cabecera del pedido
INSERT INTO Pedidos VALUES (25, NOW(), 'Francisco Garcia', 'Pendiente de Entrega');

# Se inserta el detalle del pedido
INSERT INTO DetallePedidos (CodigoPedido, CodigoProducto, Unidades) VALUES (25, 'AAAF102', 2);

# Aceptar transacción
COMMIT WORK;

Concurrencia en Transacciones de Bases de Datos

Cuando se utilizan transacciones, pueden surgir problemas de concurrencia en el acceso a los datos, es decir, problemas ocasionados por el acceso al mismo dato por dos transacciones distintas.

Problemas Comunes de Concurrencia:

  • Dirty Read (Lectura Sucia)

    Una transacción lee datos escritos por otra transacción que aún no ha confirmado (COMMIT).

  • Non-repeatable Read (Lectura No Repetible)

    Una transacción vuelve a leer datos que leyó previamente y encuentra que han sido modificados por otra transacción.

  • Phantom Read (Lectura Fantasma)

    Una transacción lee datos que no existían cuando se inició la transacción.

Niveles de Aislamiento de Transacciones

Cuando se trabaja con transacciones, el SGBD puede bloquear conjuntos de datos para evitar o permitir que ocurran estos problemas. Según el nivel de concurrencia que se desee, es posible solicitar al SGBD cuatro niveles de aislamiento. Un nivel de aislamiento define cómo los cambios hechos por una transacción son visibles para otras transacciones:

  • Read Uncommitted (Lectura No Confirmada)

    Permite que ocurran los tres problemas mencionados. Las sentencias SELECT son ejecutadas sin realizar bloqueos, por tanto, todos los cambios hechos por una transacción son visibles para las otras transacciones.

  • Read Committed (Lectura Confirmada)

    Los datos leídos por una transacción pueden ser modificados por otras transacciones. Se pueden dar los problemas de Phantom Read y Non-repeatable Read.

  • Repeatable Read (Lectura Repetible)

    Tan solo se permite el problema del Phantom Read. Consiste en que ningún registro leído con un SELECT puede ser modificado en otra transacción.

  • Serializable

    Las transacciones ocurren de forma totalmente aislada de otras transacciones. Se bloquean las transacciones de tal manera que ocurren unas detrás de otras, sin permitir concurrencia.

Concepto Fundamental de Transacciones

Las transacciones son conjuntos de operaciones SQL que se ejecutan de forma atómica. Una vez iniciadas, se pueden confirmar (COMMIT) o revertir (ROLLBACK).

Entradas relacionadas: