Operaciones transaccionales en la base de datos en Laravel

- Andrés Cruz

In english

Operaciones transaccionales en la base de datos en Laravel

Este material forma parte de mi curso y libro completo; puedes adquirirlos desde el apartado de libros y/o cursos Curso y Libro Laravel 11 con Tailwind Vue 3, introducción a Jetstream Livewire e Inerta desde cero - 2024.

Dependiendo del tipo de aplicación que queramos construir, muchas veces es necesario realizar múltiples operaciones en la base de datos de manera segura, por ejemplo, una compra de un artículo de un libro que debemos de hacer pasos como los siguientes:

  1. Registrar el identificador de pago en la base de datos.
  2. Descontar las cantidades del inventario.
  3. Registrar el producto en algún listado de compras del cliente.

Esto por comentan unos posibles pasos, pero, pueden ser más y pueden estar en cualquier orden, hay muchos otros casos en que es necesario hacer varias operaciones en la base de datos y si una de estas falla, entonces todas las operaciones anteriores deberían de ser revertidas para evitar dejar el proceso en un estado intermedio; en el ejemplo anterior, pudiéramos decir que si llego al paso dos y por alguna razón ya no hay el producto en inventario, la operación anterior daría un error y no pudiera registrar el paso tres al no poder descontar el producto del inventario, dejando la orden en un limbo ya que el paso uno si se hubiera completado.

 

Y es aquí donde entra el uso de las operaciones transaccionales que permiten agrupar un conjunto de consultas en una única unidad de trabajo, asegurando que todas se ejecuten correctamente o ninguna de ellas lo haga. En otras palabras, si una consulta falla, se revierten todas las modificaciones realizadas previamente en la base de datos. En nuestro ejemplo anterior, si hay un problema en cualquier de los pasos, Laravel revierte todas las operaciones, con esto, garantizamos la integridad de los datos, evitando que la orden quede en un limbo y atomicidad de las operaciones, ya que todas las operaciones se realizan en una misma unidad de trabajo y si alguna de ellas falla todas las operaciones son revertidas y con esto cumplimos el objetivo principal de que la aplicación sea segura ante posibles problemas como los mencionamos antes.

Aquí tenemos un ejemplo de su uso:

use Illuminate\Support\Facades\DB;

try {
    // inicia la transaccion
    DB::beginTransaction();

    // Realiza tus consultas aquí
    DB::table('users')->insert(['name' => 'John Doe']);
    DB::table('orders')->insert(['user_id' => 1, 'total_amount' => 100]);

    DB::commit(); // Confirma los cambios en la base de datos
} catch (\Exception $e) {
    DB::rollback(); // Revierte los cambios en caso de error
    return $e->getMessage();
}

En este ejemplo:

  • DB::beginTransaction() inicializa la transacción.
  • Dentro del bloque try, realizamos nuestras todas las operaciones a la base de datos mediante nuestros modelos o similares.
  • Si todas las operaciones que queríamos realizar fueron resueltas exitosamente, llamamos al método DB::commit() para confirmar los cambios.
  • Si ocurre un error, el bloque catch llama a DB::rollback() para revertir todos los cambios que se hayan podido realizar.

También se puede implementar mediante un callback:

DB::transaction(function () {

    // Realiza tus consultas aquí
    DB::table('users')->insert(['name' => 'John Doe']);
    DB::table('orders')->insert(['user_id' => 1, 'total_amount' => 100]);
    DB::commit();
});
Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.