어떤 경우에는 일련의 작업을 연속적으로 수행해야 하며, 모든 작업을 어중간한 작업 없이 모두 성공적으로 완료하는 것이 중요합니다.
일반적인 예로는 역할을 할당하고 등록 이메일을 보내는 것이 필수적인 사용자 생성을 들 수 있습니다.
이러한 상황을 처리하기 위해 트랜잭션이 사용됩니다. 다음은 사용자를 생성하고 역할을 할당한 후 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 Facade의 또 다른 보다 구체적인 트랜잭션 방법도 제공합니다. 이 경우 커밋과 롤백이 자동으로 수행됩니다. 작업 횟수가 적거나 롤백을 수행하기 전에 추가 작업이 필요하지 않은 경우에 권장됩니다
DB::transaction(function () use($data){ $user = User::create($data); $user->syncRoles([$data['role']]); $this->sendEmail([ 'email' => $data['email'], ]); return $user; });
중요: 데이터베이스 엔진 고려 사항
모든 스토리지 엔진이 트랜잭션을 지원하는 것은 아닙니다. InnoDB는 트랜잭션을 지원하는 엔진이지만 MyISAM은 지원하지 않습니다. 데이터베이스 테이블이 올바르게 작동하려면 트랜잭션을 지원하는 엔진을 사용하고 있는지 확인하는 것이 중요합니다.
위 내용은 Laravel의 트랜잭션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!