피드로 돌아가기
Atomicity
Dev.toDev.to
Database

Atomicity

데이터베이스 트랜잭션이 BEGIN/COMMIT/ROLLBACK을 통해 송금 작업의 원자성을 보장해 부분 업데이트 방지

Jarvish John2026년 3월 25일6beginner

Context

송금 시스템에서 발신자 계좌 차감과 수신자 계좌 증액이 독립적으로 실행되면 한쪽만 성공하는 불일치 상황이 발생할 수 있다. 트랜잭션 기능 없이는 중간 실패 시 데이터 일관성이 깨진다.

Technical Solution

  • BEGIN과 COMMIT으로 두 UPDATE 문을 하나의 원자적 블록으로 묶기: 두 업데이트가 함께 성공하거나 함께 실패하도록 강제
  • ROLLBACK 명령어로 부분 실행 상태 되돌리기: 첫 번째 UPDATE 후 에러 발생 시 모든 변경사항 취소
  • WHERE 조건에 잔액 확인 추가하기: balance >= 150 조건으로 송금 전 잔액 검증 후에만 차감 실행
  • 존재하지 않는 계좌 업데이트 시뮬레이션: 수신자 계좌가 없을 때 트랜잭션 전체 롤백 동작 확인
  • 트랜잭션 전후 SELECT로 상태 검증하기: 각 단계 후 계좌 잔액을 조회해 예상 결과 확인

Key Takeaway

원자성은 데이터베이스 트랜잭션의 핵심으로, 다중 단계 작업에서 성공과 실패를 일괄 처리함으로써 중간 상태의 일관성 깨짐을 원천 차단한다. 금융 거래처럼 상호 의존적인 업데이트가 필요한 도메인에서 필수 설계 원칙이다.


금융 거래, 인벤토리 차감, 주문 처리 등 다중 테이블 업데이트가 필요한 애플리케이션에서 BEGIN/COMMIT/ROLLBACK 트랜잭션을 적용하면 부분 성공으로 인한 데이터 불일치를 방지할 수 있다. 사전 조건(WHERE balance >= amount) 검증을 트랜잭션 내부에 포함하면 유효하지 않은 상태 전환을 사전 차단할 수 있다.

원문 읽기