Seguro que muchos habéis oido hablar de las transacciones SQL. Sus usos, sus pros y contras y un largo etc que está muy bien documentado. Y como hoy en día hay información a patadas, vamos a pasar al plato fuerte. Un caso real y como siempre sencillito para no marearnos en exceso.
Supongamos que tenemos nuestra tabla de categorías y nuestra tabla de productos en nuestra base de datos. Tenemos nuestro backend donde nos muestra el listado de productos y las categorías a las que pertenecen.
Pero qué pasa cuando quiero cambiar la categoría de +100 productos?. ¿Voy producto por producto?. Y si cambio el nombre de la categoría ha de verse reflejado en los productos a los que pertenece.
Aquí entra en juego las transacciones. Necesitaba actualizar las 2 tablas al mismo tiempo y que no hubiese ningún problema durante el transcurso de la operación. Y en caso de que lo hubiese, no se aplicara ningún cambio.
Y ahora que tenemos la idea, vamos a ponerla en práctica.
[code language=”php”]
try {
$query=$this->dbh;
$query->beginTransaction();
//Actualizamos la primera tabla
$sql = “UPDATE tipoproducto SET tipoProducto = ‘”.$tipoProducto.”‘ , imgCategoria = ‘”.$imgCategoria.”‘ WHERE idTipo = ‘”.$idTipo.”‘”;
$stmt = $query->prepare($sql);
$stmt->execute(array(
‘:idTipo’ => $idTipo,
‘:tipoProducto’ => $tipoProducto,
‘:imgCategoria’ => $imgCategoria
)
);
//Actualizamos la segunda
$sql = “UPDATE productos SET tipoProducto = ‘$tipoProducto’ WHERE idTipo = ‘$idTipo'”;
$stmt = $query->prepare($sql);
$stmt->execute(array(
‘:idTipo’ => $idTipo,
‘:tipoProducto’ => $tipoProducto
)
);
//Si todo ha ido bien, hacemos un commit.
$query->commit();
} catch (Exception $e) {
$query->rollBack();
// $e->getMessage();
// exit($e);
//Si ha habido error, se deshacen cambios.
}
[/code]
Saludos!.