Transacciones¶
Una transacción es un grupo de instrucciones que se ejecutan de forma completa o se anulan bajo ciertas condiciones. En un sistema transaccional, se cumplen las propiedades ACID:
- Atomicidad: Todas las operaciones de una transacción se realizan como una unidad indivisible. Si alguna operación falla, todas las operaciones se deshacen (rollback) para mantener la coherencia de los datos.
- Consistencia: La ejecución de una transacción lleva el sistema de un estado válido a otro estado válido. La base de datos queda en un estado consistente después de una transacción exitosa.
- Aislamiento (Isolation): Cada transacción se ejecuta de manera aislada de otras transacciones, lo que significa que los cambios realizados por una transacción no son visibles para otras transacciones hasta que se confirme la transacción.
- Durabilidad: Los cambios realizados por una transacción confirmada permanecen incluso en caso de falla del sistema, asegurando que los datos persistan de forma permanente.
Implementación en PHP con PDO¶
Para añadir capacidad transaccional a una aplicación PHP:
- Asegúrate de que el SGBD soporte transacciones ACID.
- Define la transacción y deshabilita el modo auto-commit para evitar que cada instrucción se ejecute de forma individual.
- Ejecuta las operaciones dentro de la transacción. Para ello, debes indicar el inicio de la transacción mediante
beginTransaction()
- Confirma la transacción si no hay problemas mediante
commit()
, pero revisa si hay errores y realiza unrollBack()
(con la B mayúscula) si es necesario.
Ejemplo de uso¶
<?php
try {
// Inicio de la transacción
$pdo->beginTransaction();
// Ejecución de instrucciones (o una sola, en el caso más simple)
$stmt = $pdo->prepare("INSERT INTO tabla (campo1, campo2) VALUES (?, ?)");
$stmt->execute([$valor1, $valor2]);
// Confirmación de la transacción
$pdo->commit();
echo "Transacción completada exitosamente";
} catch (Exception $e) {
// Revisión de errores y rollback en caso necesario
$pdo->rollBack();
echo "Error en la transacción: " . $e->getMessage();
}
?>
Actividades¶
-
AC 618. (RA6 / CE6e CE6f CE6g / IC1 / 3p) - Partimos de la actividad AC 616 donde insertabas registros en la tabla
usuario
. Ahora, amplía el proceso para que también se inserte un registro relacionado en la tablacampeon
. Queremos que ambas operaciones ocurran en una misma transacción. -
PR 619. (RA6 / CE6e CE6f CE6g / IC2 / 5p) - Ahora que sabes cómo utilizar transacciones para controlar operaciones múltiples en la base de datos, vamos a aplicar este conocimiento a un sistema de gestión de campeones del juego League of Legends. Imagina que ahora además de tener la tabla
campeon
, cuentas también con una tablahistorial_creacion
, donde se almacena un registro cada vez que se añade un nuevo campeón. Tu tarea es:- Insertar un nuevo registro en la tabla
campeon
con todos sus datos (nombre
,rol
,dificultad
,descripcion
). -
Insertar simultáneamente un registro en la tabla
historial_creacion
con los siguientes campos:id
(autoincremental)campeon_id
(clave foránea acampeon.id
)fecha_creacion
(tipoDATETIME
)creado_por
(nombre del usuario que añadió el campeón)
- Insertar un nuevo registro en la tabla