場合によっては、一連の連続した操作を実行する必要があり、中途半端な作業が残されることなく、すべてが正常に完了することが重要です。
一般的な例はユーザーの作成です。この場合、役割も割り当てられ、登録メールが送信されることが重要です。
このような種類の状況に対処するには、トランザクションが使用されます。ここでは、ユーザーを作成し、ロールを割り当て、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 中国語 Web サイトの他の関連記事を参照してください。