데이터를 파일로 저장하지 않고 데이터베이스에 저장하는 이유는
데이터베이스는 트랜잭션이라는 개념을 지원하기 때문이다.
그럼, 트랜잭션이란?
하나의 거래를 안전하게 처리하도록 보장해주는 것이다.
하나의 거래를 안전하게 처리하는 것에 있어서 문제가 발생하는 경우를 살펴보면, 대표적인 예로 계좌이체를 들 수 있다.
A가 B에게 5000원을 송금한다고 가정해보자. 그렇다면 수행되는 작업은
- A의 계좌에서는 5000원이 출금된다.
- B의 계좌에는 5000원이 입금된다.
로 정의할 수 있다. 이 두 개의 작업이 합쳐져서 하나의 작업처럼 동작해야 한다. 1번 작업은 성공했는데 2번 작업을 실패했다면 A의 잔고만 줄어드는 문제가 발생한다.
데이터베이스에서 제공하는 트랜잭션 기능을 사용하면, 위의 예시에서 두 개의 작업이 함께 성공해야 저장하고, 거래가 실패하면 거래 전의 상태로 돌아갈 수 있다.
모든 작업이 성공해서 데이터베이스에 정상적으로 반영하는 것을
커밋(Commit)
이라고 한다. 작업 중 하나라도 실패해서 거래 이전으로 되돌리는 것을롤백(Rollback)
이라고 한다.
트랜잭션은 ACID
를 보장해야 한다. 각각을 살펴보면 다음과 같다.
원자성(Atomicity)
일관성(Consistency)
격리성(Isolation)
지속성(Durability)
트랜잭션은 원자성, 일관성, 지속성은 보장하지만, 격리성
이 문제가 된다. 트랜잭션 간에 격리성을 완전히 보장하기 위해서는 트랜잭션을 거의 순서대로 실행해야 한다. 하지만 이렇게 처리하면 동시 처리 성능이 매우 나빠진다. ANSI 표준은 트랜잭션 격리 수준을 4단계로 나누어 정의했다.
트랜잭션 시작
계좌이체와 같은 작업을 수행할 때는 반드시 수동 커밋 모드를 사용해야 한다. 수동 커밋 모드를 사용해서
수동으로 커밋
,롤백
이 가능하도록 가능하도록 해야한다.자동 커밋모드에서 수동 커밋 모드로 전환
하는 것을트랜잭션을 시작
한다고 한다.
트랜잭션 사용법
데이터 변경 쿼리를 실행하고 DB에 해당 결과를 반영하고 싶으면 커밋 명령어인
commit
을 호출한다. 결과를 반영하고 싶지 않으면 롤백 명령어인rollback
을 호출한다.
커밋을 호출하기 전까지는 임시로 데이터를 저장하는 것이다. 해당 트랜잭션을 시작한 세션 혹은 사용자에게만 변경 데이터가 보이고 다른 세션 혹은 사용자에게는 변경 데이터가 보이지 않는다.