Transaction
: 프로그램의 처리 단위(e.g., 계좌 이체, 수강 신청 ..)
유저가 많아지면 데이터베이스에 동시에 접근하는 상황이 발생할 수 있다.
이 경우, 데이터베이스에 대한 Concurrency control(동시성 제어)가 필요하다.
동시성 제어
직원의 월급을 6% 인상해주는 쿼리가 있다고 하자. 해당 회사 직원은 500명인데 1~320번 직원까지 업데이트하고 DBMS가 갑자기 죽었다. 그러면 DBMS는 어떻게 해야할까? 만약 DBMS가 Log를 기록하지 않았다면 어떡할까?
이번에는 계좌 이체 트랜잭션의 예시다. 아마도 M.Jung이 M.Ahn에게 10만원을 보내는 것이겠다.
두 가지의 update 쿼리가 있는데 먼저 보내는 사람의 계좌에서 10만원을 빼고, 그 후 받는 사람의 계좌에 10만원을 넣는다.
만약 1번째 쿼리를 수행하고 완료 후 2번째 쿼리 시작 전 DBMS가 죽으면 어떻게 할까?
즉, DBMS는 쿼리 단위가 아닌 Transaction의 단위로 수행을 완료해야 한다. 수행 중 문제가 생겼다면 아무것도 실행하지 않은 상태로 둬야 일관성을 보장할 수 있다.
Atomicity
Consistency
Isolation
Durability
커밋은 트랜잭션이 성공적으로 완료된 것이다.
롤백은 중간에 문제가 생긴 것, 이전 상태로 다시 되돌려야 한다.
트랜잭션의 실패 원인은 다양하다. 메인 메모리 문제 같은 system failure, 비행기 예약 트랜잭션에서 솔드 아웃된 상황에서 abort된 transacion failure, 하드웨어 이슈 같은 media failure, 커뮤니케이션 문제, 자연 재해 등등,,
데이터베이스도 결국 하나의 파일로 저장된다.
만약 트랜잭션에 성공해 메모리에 반영이 되었지만 파일, 하드디스크에 반영이 되기 전에 DBMS가 죽는 경우의 수가 있다. 또한, OS 정책에 따라 메모리 내용이 하드웨어에 반영된 경우라면 반영 이후 트랜잭션이 실패했다면 골이 아파진다.