라라 벨에서는 데이터베이스 트랜잭션 내에서 일련의 작업을 실행하기 위해 DB파사드에서 제공하는 transaction 메서드를 사용할 수 있습니다. 이는 Eloquent ORM, Query Builder 모두에 대한 트랜젝션을 제어하는데 2가지 방식이 있습니다.
1. 클로저가 성공적으로 실행되면 트랜잭션을 자동으로 커밋하게 하고, 실패하면 예외가 발생하며 자동 롤백되는 아래와 같은 자동 형태의 사용 방식
## 자동 형식의 트랜잭션
use Illuminate\Support\Facades\DB;
DB::transaction(function () {
DB::update('update users set votes = 1');
DB::delete('delete from posts');
});
2. 수동으로 트랜잭션을 시작하여 롤백 및 커밋 지점을 개발자가 제어하는 수동 형태의 사용 방식
## 수동 형식의 트랜잭션
use Illuminate\Support\Facades\DB;
DB::beginTransaction();
try{
DB::update('update users set votes = 1');
DB::delete('delete from posts');
DB::commit();
}catch(Exception $ie){
DB::rollBack();
}
위 2가지 방식을 진행할 때, DB::rollBack()으로 가야 하는 상황이 있음에도 불구하고 commit() 처리가 되는 상황이 발생하면 아래 확인사항을 체크하고, 트랜잭션을 사용하기 위해 올바른 DB 설정을 해줘야 합니다.
1. DB Console창에서 AutoCommit 설정값 확인하기
show variables like 'autocommit%';
2. AutoCommit 해제 또는 설정하기
SET AUTOCOMMIT = FALSE; --> 해제
SET AUTOCOMMIT = TRUE; --> 설정
3. SQL을 사용하는 환경의 cnf 파일 변경하기
## sql 구동 디렉토리 / cnf파일 수정
## /etc/my.cnf.d/server.cnf
[mysqld]
autocommit=0 --> autocommit 해제
4. Laravel DB파사드 beginTransaction() 메서드 위치 및 rollBack(), commit() 위치 확인 및 DB파사드의 connection 확인
## 올바른 위치 및 DB connection 다시 확인하기
DB::connection("your-db");
DB::beginTransaction();
try{
DB::update('update users set votes = 1');
DB::delete('delete from posts');
DB::commit();
}catch(Exception $ie){
DB::rollBack();
}
'Framework > Laravel' 카테고리의 다른 글
Laravel에서 AWS CloudFront Invalidation 생성 및 조회하기 (2) | 2022.12.06 |
---|---|
[Model] 같은 형태에 대한 여러개의 테이블이 존재할 때, 1개의 Model로 사용하기 version 2.0 (0) | 2022.07.12 |
[Laravel] Global Variable / Constant / Function 정의 및 사용에 대한 고찰 (0) | 2022.07.08 |
[Model] 같은 형태에 대한 여러개의 테이블이 존재할 때, 1개의 Model로 사용하기 version 1.0 (1) | 2022.05.19 |
데이터 대량 Insert Or Update 방법에 관한 고찰 - Migration And Seeder 사용하기 (0) | 2022.03.17 |
댓글