[Laravel] Transaction 작동 안되는 현상 해결

라라 벨에서는 데이터베이스 트랜잭션 내에서 일련의 작업을 실행하기 위해 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();
}