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:
- Iniciar una transacción: Se utiliza una instrucción específica para iniciar una transacción (por ejemplo,
BEGIN TRANSACTIONen SQL Server,START TRANSACTIONen MySQL). - Ejecutar operaciones: Se ejecutan las operaciones de base de datos que forman parte de la transacción.
- 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
Publicar un comentario