首頁  >  文章  >  後端開發  >  Laravel 中的交易

Laravel 中的交易

Susan Sarandon
Susan Sarandon原創
2024-10-22 08:07:02416瀏覽

Transacciones en laravel

在某些場合,我們需要進行一系列連續的操作,必須全部順利完成,不能半途而廢。

一個常見的範例是建立用戶,其中還必須指派角色並發送註冊電子郵件。

為了處理這些類型的情況,需要使用事務。以下方法建立使用者、指派角色,然後透過 sendEmail() 方法傳送電子郵件。此方法接收電子郵件作為參數並相應地發送它。

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");
   }
}

我們必須應用3種方法:

  • DB::beginTransaction();開始交易
  • 資料庫::提交();確認更改
  • DB::回滾();如果無法執行任何操作,它將恢復所有更改,使狀態與事務開始前相同。

在我們剩下的之前的程式碼中實作交易:

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");
     }
 }

這樣我們就可以確保這組操作完全執行或根本不執行。

Laravel 也提供了另一種更具體的 DB 門面事務方法。在這種情況下,提交和回滾是自動完成的。當操作次數很少或在執行回滾之前不需要額外操作時建議這樣做

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

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

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

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

  return $user;
});

重要:資料庫引擎注意事項
並非所有儲存引擎都支援事務。 InnoDB是一個確實支援事務的引擎,而MyISAM則不支援。確保您的資料庫表使用支援事務的引擎才能正常運行,這一點至關重要。

以上是Laravel 中的交易的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn