[DB] 데이터베이스 트랜잭션이란?
그동안 대충 알고있던 트랜잭션 개념에 대해 자세히 알아보겠습니다.
공부하기 이전 막연하게 트랜잭션은 여러가지 일들을 하나의 일처럼 생각해서 데이터베이스에 한번에 커밋하는것 이라고 생각했습니다.
뭔가 틀린말은 아니지만 그렇다고 맞는말도 아닌것 같네요.
좀 더 예쁜말로 트랜잭션을 정의하려면 트랜잭션의 성질에 대해 알아봐야하기 때문에 트랜잭션의 대표적인 성질 ACID 에 대해 먼저 알아보겠습니다.
ACID 란 트랜잭션의 안정성을 보장하기 위한 네가지 성질 atomicity, consistency, isolation, durability 을 의미합니.
1. atomicity (원자성)
한 트랜잭션의 연산들이 모두 성공하거나, 모두 실패되는 성질.
2. consistency (일관성)
한 트랜잭션의 이전과 이후 데이터베이스의 상태가 유효해야한다. 여기서 유효하다는 말은 데이터베이스의 제약조건을 모두 지킨다는 뜻이다.
3. isolation (격리성)
모든 트랜잭션은 다른 트랜잭션으로부터 격리되어야한다.
격리성에 대해 이해하기가 어려웠기때문에 예시를 들겠습니다.
** 격리성을 지키지 못하는 상황 **
<현재 상황>
A의 계좌 : 400,000
B의 계좌 : 600,000
A는 B의 계좌에 200,000 원을 입금하려하고 B는 자신의 계좌에 300,000 을 입금하려함
만약 이 상황에서 A 계좌에서 200,000 만원을 출금한 상태에서 B 계좌에 300,000 만원이 입금되면 B 계좌의 상태는 900,000 원이 됩니다. 하지만 A 계좌에서 출금한 시점에 B의 계좌는 800,000 이 돼야하므로 결과적으로 B 계좌는 110,000이 아닌 800,000 이 돼버립니다.
이런 상황이 발생하지 않게 하기 위해서 트랜잭션이 동시에 실행될 때와 연속적으로 실행될 때의 데이터베이스 상태를 동일하게 만들어야 합니다.
4. durability (지속성)
commit 된 트랜잭션은 DB에 영구적으로 저장된다.
영구적으로 저장한다 할때는 일반적으로 비 휘발성 메모리 (SSD, HDD) 에 저장함을 의미한다.
결국 DB 시스템에 문제가 생기더라도 commit 된 트랜잭션은 DB에 남아있다.
트랜잭션이란 데이터베이스의 위의 네가지 성질을 지키며 데이터베이스의 상태를 변화시키기 위해 하나 이상의 쿼리를 모아놓은 하나의 작업단위를 뜻합니다.