Transacciones en laravel

En ciertas ocasiones, necesitamos realizar una serie de operaciones consecutivas, y es fundamental que todas se completen con éxito, sin que ninguna quede a medias.

Un ejemplo común es la creación de un usuario, donde es esencial que también se asigne…


This content originally appeared on DEV Community and was authored by Fernilo

En ciertas ocasiones, necesitamos realizar una serie de operaciones consecutivas, y es fundamental que todas se completen con éxito, sin que ninguna quede a medias.

Un ejemplo común es la creación de un usuario, donde es esencial que también se asignen roles y se envíe un correo de registro.

Para manejar este tipo de situaciones, se utilizan las transacciones. A continuación, presentamos un método que crea un usuario, asigna el rol, y luego envía un correo a través del método sendEmail(). Este método recibe el correo electrónico como argumento y realiza el envío correspondiente.

use Illuminate\Support\Facades\DB;

public function save(array $data)
{
    try {
           $user = User::create($data);

           $user->syncRoles([$data['role']]);

           $this->sendEmail([
                'email' => $data['email'],
           ]);

            return $user;
   } catch (\Exception $e) {
          throw new BadRequestException("Error al guardar nuevo usuario");
   }
}

Debemos aplicar 3 métodos:

  • DB::beginTransaction(); Inicia una transacción
  • DB::commit(); Confirma los cambios
  • DB::rollback(); En caso de que alguna operación no se pueda realizar revertirá todos los cambios haciendo que el estado sea el mismo a antes del inicio de la transacción.

Implementando transacciones en el código anterior nos queda:

use Illuminate\Support\Facades\DB;

public function save(array $data)
{
     // Iniciar la transacción
     DB::beginTransaction();
     try {

        $user = User::create($data);

        $user->syncRoles([$data['role']]);

        $this->sendEmail([
             'email' => $data['email'],
        ]);

        // Confirmo la transacción
        DB::commit();

        return $user;
     } catch (\Exception $e) {
        // Si falla hago rollback
        DB::rollback();

        throw new BadRequestException("Error al guardar nuevo usuario");
     }
 }

Con esto nos aseguramos que el conjunto de operaciones se ejecuten completamente o no se ejecuten en absoluto.

Laravel también proporciona otro método mas concreto transaction de la fachada DB. En este caso el commit y el rollback se realizan de forma automática. Esto es recomendable cuando la cantidad de operaciones son pocas o no requiere operaciones adicionales antes de realizar el rollback

DB::transaction(function () use($data){

  $user = User::create($data);

  $user->syncRoles([$data['role']]);

  $this->sendEmail([
      'email' => $data['email'],
  ]);

  return $user;
});

Importante: Consideraciones del motor de base de datos
No todos los motores de almacenamiento soportan transacciones. InnoDB es un motor que sí soporta transacciones, mientras que MyISAM no lo hace. Es fundamental asegurarse de que las tablas de la base de datos estén utilizando un motor que admita transacciones para que estas funcionen correctamente.


This content originally appeared on DEV Community and was authored by Fernilo


Print Share Comment Cite Upload Translate Updates
APA

Fernilo | Sciencx (2024-10-21T23:01:26+00:00) Transacciones en laravel. Retrieved from https://www.scien.cx/2024/10/21/transacciones-en-laravel/

MLA
" » Transacciones en laravel." Fernilo | Sciencx - Monday October 21, 2024, https://www.scien.cx/2024/10/21/transacciones-en-laravel/
HARVARD
Fernilo | Sciencx Monday October 21, 2024 » Transacciones en laravel., viewed ,<https://www.scien.cx/2024/10/21/transacciones-en-laravel/>
VANCOUVER
Fernilo | Sciencx - » Transacciones en laravel. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2024/10/21/transacciones-en-laravel/
CHICAGO
" » Transacciones en laravel." Fernilo | Sciencx - Accessed . https://www.scien.cx/2024/10/21/transacciones-en-laravel/
IEEE
" » Transacciones en laravel." Fernilo | Sciencx [Online]. Available: https://www.scien.cx/2024/10/21/transacciones-en-laravel/. [Accessed: ]
rf:citation
» Transacciones en laravel | Fernilo | Sciencx | https://www.scien.cx/2024/10/21/transacciones-en-laravel/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.