[DB] 주문이 실패되면 어떡해요? (feat. Transaction)

Zain·2025년 1월 25일
post-thumbnail

앱 내 펫 구매 관련 개발을 진행하다 보니, 여러 테이블에 값을 업데이트하는 작업 간에 트랜잭션의 필요성을 느꼈음.

  1. 유저 포인트 테이블 차감
  2. 펫 메인 테이블 insert
  3. 펫 배고픔 테이블 insert (펫 메인 1:1)
  4. 펫 탐험 테이블 insert (펫 메인 1:1)

위와 같은 테이블 관계가 이루어져 있는데, 예를 들어 4번 작업에서 실패하면 1, 2, 3번 작업을 롤백 시켜주는 무언가가 필요했음.
트랜잭션을 통해 위의 상황을 매끄럽게 개선하고자 하여 학습 차원에서 블로그를 작성함.

Laravel에서의 Transaction

1. Transaction이란?

Transaction은 데이터베이스 작업에서 하나의 논리적 작업 단위. 여러 데이터 조작 작업(삽입, 수정, 삭제 등)을 하나로 묶어 실행하고, 이 모든 작업이 성공해야만 데이터베이스에 적용됨. 하나라도 실패하면 롤백(Rollback)되어 데이터베이스가 원래 상태로 복원됨.

주요 특징:

  • 원자성(Atomicity): 모든 작업이 성공하거나 실패함.
  • 일관성(Consistency): 데이터가 항상 유효한 상태로 유지됨.
  • 독립성(Isolation): 하나의 트랜잭션이 완료되기 전까지 다른 트랜잭션에 영향을 주지 않음.
  • 지속성(Durability): 트랜잭션이 성공적으로 커밋되면 결과가 영구적으로 저장됨.

2. Transaction의 동작 순서

동작 순서

1. 트랜잭션 시작
- 트랜잭션 블록을 시작합니다. (DB::beginTransaction() 호출)
2. 작업 수행
- 데이터베이스 작업(삽입, 수정, 삭제 등)을 실행합니다.
3. 커밋(Commit)
-모든 작업이 성공적으로 실행되면 트랜잭션을 커밋하여 변경 사항을 영구적으로 저장합니다. (DB::commit())
4. 롤백(Rollback)
- 작업 중 오류가 발생하면 트랜잭션을 롤백하여 데이터베이스를 원래 상태로 복구합니다. (DB::rollBack())

예시

try {
    DB::beginTransaction(); // 트랜잭션 시작

    // 데이터베이스 작업
    User::create([...]);
    Order::create([...]);

    DB::commit(); // 모든 작업이 성공적으로 완료되면 커밋
} catch (\Exception $e) {
    DB::rollBack(); // 오류 발생 시 롤백
    throw $e; // 에러를 상위로 던짐
}

Transaction 세션과 실제 데이터베이스

트랜잭션 내에서의 변경 사항은 커밋되기 전까지는 데이터베이스에 반영되지 않기 때문에 다른 트랜잭션이나 외부에서 볼 수 없음. 또한, 트랜잭션이 롤백되면 세션에 저장된 변경 사항은 전혀 반영되지 않으므로 데이터베이스의 상태는 전혀 변화하지 않음.

  • 트랜잭션이 커밋되면, 트랜잭션 내에서 실행된 모든 쿼리는 영구적으로 데이터베이스에 반영됨.
  • 트랜잭션이 롤백되면, 데이터베이스의 상태는 전혀 변화하지 않으며 모든 변경 사항은 취소됨.

트랜잭션에서 실행된 쿼리들은 데이터베이스의 세션에 임시로 저장되며, 커밋 후에야 실제 데이터베이스에 반영됨. 이로써, 중간에 오류가 발생하거나 문제가 생겼을 때 롤백을 통해 데이터베이스를 원래 상태로 복구할 수 있음. 트랜잭션은 데이터의 무결성을 보장하고, 여러 작업을 하나의 단위로 묶어 안정적이고 일관성 있는 처리를 가능하게 함.

profile
Vue, Laravel | TS, JS, PHP, MySQL

0개의 댓글