Procedimiento almacenado, manejo de transacciones


¿Qué son las transacciones?

Una transacción es una secuencia de operaciones de base de datos que se tratan como una unidad de trabajo atómica. Esto significa que todas las operaciones dentro de una transacción se completan con éxito o ninguna se completa. Las transacciones garantizan la integridad de los datos, ya que evitan que la base de datos quede en un estado inconsistente.

¿Por qué son importantes las transacciones en procedimientos almacenados?

  • Integridad de los datos: Aseguran que los datos se mantengan consistentes, incluso en caso de fallas del sistema.
  • Atomicidad: Todas las operaciones dentro de una transacción se ejecutan como un todo único.
  • Aislamiento: Las transacciones se ejecutan de forma aislada, evitando conflictos con otras transacciones.
  • Durabilidad: Una vez que una transacción se confirma (commit), los cambios se hacen permanentes.

Cómo administrar transacciones en procedimientos almacenados:

La forma de administrar transacciones varía ligeramente entre los diferentes sistemas de gestión de bases de datos (SGBD), pero en general, los pasos son los siguientes:

  1. Iniciar una transacción: Se utiliza una instrucción específica para iniciar una transacción (por ejemplo, BEGIN TRANSACTION en SQL Server, START TRANSACTION en MySQL).
  2. Ejecutar operaciones: Se ejecutan las operaciones de base de datos que forman parte de la transacción.
  3. Confirmar o abortar la transacción:
    • Confirmar (COMMIT): Si todas las operaciones se ejecutan correctamente, se confirma la transacción, haciendo permanentes los cambios.
    • Abortar (ROLLBACK): Si ocurre algún error, se aborta la transacción, deshaciendo todos los cambios realizados.

Ejemplo en SQL Server:

SQL
CREATE PROCEDURE ActualizarSalario
    @EmpleadoID int,
    @NuevoSalario money
AS
BEGIN
    BEGIN TRANSACTION
        UPDATE Empleados
        SET Salario = @NuevoSalario
        WHERE EmpleadoID = @EmpleadoID;

        IF @@ROWCOUNT = 0
        BEGIN
            ROLLBACK TRANSACTION
            PRINT 'Empleado no encontrado'
        END
        ELSE
        BEGIN
            COMMIT TRANSACTION
            PRINT 'Salario actualizado correctamente'
        END
    END TRANSACTION
END

Ejemplo en PostgreSQL:

SQL
CREATE OR REPLACE FUNCTION ActualizarSalario(
    p_empleado_id integer,
    p_nuevo_salario numeric
) RETURNS void AS $$
BEGIN
    BEGIN
        UPDATE empleados
        SET salario = p_nuevo_salario
        WHERE empleado_id = p_empleado_id;

        IF NOT FOUND THEN
            RAISE EXCEPTION 'Empleado no encontrado';
        END IF;
    END;
END;
$$ LANGUAGE plpgsql;

Ejemplo en Oracle:

SQL
CREATE OR REPLACE PROCEDURE ActualizarSalario(
    p_empleado_id NUMBER,
    p_nuevo_salario NUMBER
)
IS
BEGIN
    UPDATE empleados
    SET salario = p_nuevo_salario
    WHERE empleado_id = p_empleado_id;

    IF SQL%ROWCOUNT = 0 THEN
        RAISE_APPLICATION_ERROR(-20001, 'Empleado no encontrado');
    END IF;
END;
/

Consideraciones importantes:

  • Aislamiento: Los diferentes niveles de aislamiento (read committed, repeatable read, serializable) controlan cómo las transacciones ven los cambios realizados por otras transacciones.
  • Bloqueos: Las transacciones utilizan bloqueos para garantizar la consistencia de los datos.
  • Manejo de errores: Es importante manejar los errores de forma adecuada para evitar dejar la base de datos en un estado inconsistente.
  • Nidos de transacciones: Algunos SGBD permiten anidar transacciones.


Comentarios

Entradas más populares de este blog

Procedimientos almacenados, manejo de excepciones

Procedimiento almacenado recuperación de información