그런데 결제 기록은 저장됐는데 예약 저장만 실패하면 어떻게 될까?
“둘 다 성공하거나, 둘 다 없던 일로 만들 수는 없을까?”
작업 묶음에도 완성 조건이 있다
기술 이름
논리적으로 하나의 작업으로 처리되어야 하는
데이터베이스 연산의 묶음을
트랜잭션(Transaction)이라고 한다.
결제와 예약처럼 서로 떨어뜨리면 안 되는 작업을 하나의 단위로 본다.
결제 승인
↓
예약 저장
↓
둘 다 성공 → 확정
중간 실패 → 전체 취소
↓
예약 저장
↓
둘 다 성공 → 확정
중간 실패 → 전체 취소
트랜잭션을 지키는 네 가지 약속
Atomicity전부 수행되거나 전부 취소되어야 한다.
Consistency작업 전후 데이터 규칙이 유지되어야 한다.
Isolation동시에 실행되는 작업이 서로 방해하지 않아야 한다.
Durability완료된 결과는 장애가 나도 유지되어야 한다.
기술 이름
이 네 특성을 앞 글자를 따서
ACID라고 부른다.
ACID는 네 단어를 따로 외우기보다 하나의 실패 장면에 연결해 보는 편이 좋다. 결제가 중간에 멈추면 원자성, 잘못된 잔액이 남으면 일관성, 동시에 처리한 주문이 서로 섞이면 격리성, 완료한 결과가 장애 뒤 사라지면 영속성 문제다.
확정할 것인가, 되돌릴 것인가
모든 작업이 성공했다면 변경 내용을 최종적으로 저장해야 한다.
COMMIT;
반대로 중간에 문제가 발생했다면 작업 전 상태로 되돌릴 수 있어야 한다.
ROLLBACK;