在某些場合,我們需要進行一系列連續的操作,必須全部順利完成,不能半途而廢。
一個常見的範例是建立用戶,其中還必須指派角色並發送註冊電子郵件。
為了處理這些類型的情況,需要使用事務。以下方法建立使用者、指派角色,然後透過 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種方法:
在我們剩下的之前的程式碼中實作交易:
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中文網其他相關文章!