사용자 B → 10:00 비어 있음 확인
사용자 A → 예약 저장
사용자 B → 예약 저장
두 사람 모두 같은 시간을 예약해 버릴 수 있다.
문제의 핵심은 두 사용자가 같은 순간에 ‘비어 있음’을 읽었다는 데 있다. 확인과 저장이 서로 떨어진 작업으로 처리되면, 한 사용자가 저장하기 전에 다른 사용자가 같은 상태를 읽을 수 있다.
데이터베이스는 이런 상황에서 한 작업을 중간에 끊기지 않는 단위로 처리하고, 동시에 실행되는 작업끼리 서로 잘못된 상태를 보지 않도록 제어해야 한다. 트랜잭션과 동시성 제어가 필요한 이유다.
동시에 접근할 때 데이터가 꼬이지 않게
여러 트랜잭션이 같은 데이터를 동시에 읽고 수정할 때는 실행 순서를 적절히 제어해야 한다.
한 트랜잭션이 중요한 데이터를 수정하는 동안 다른 트랜잭션의 접근을 제한하는 방법을 사용할 수도 있다.
잠금이 많으면 또 다른 문제가 생긴다
A는 회원 데이터를 잠그고 예약 데이터를 기다린다.
B는 예약 데이터를 잠그고 회원 데이터를 기다린다.
B → A가 가진 자원을 기다림
둘 다 상대가 풀어 주기만 기다리며 영원히 진행하지 못할 수 있다.
장애가 나도 데이터는 돌아와야 한다
트랜잭션을 처리하던 중 갑자기 전원이 꺼질 수도 있다.
완료되지 않은 변경은 취소하고, 이미 확정된 작업은 유지해야 한다.
로그를 사용해 이전 값을 복원하거나, 완료된 작업을 다시 반영하는 방법 등이 사용된다.
UNDO와 REDO
아직 완료되지 않은 작업이 데이터에 반영되어 있다면 작업 전으로 되돌려야 한다.
반대로 완료되었지만 저장장치에 반영되지 못한 작업이라면 다시 적용해야 한다.