트랜잭션(Transaction)이란 ?
데이터베이스에서 트랜잭션은 데이터의 일관성을 보장하면서 여러 작업을 하나의 논리적 단위로 묶어 처리하는 과정을 말한다.
일관성(Consistency)란 무엇을 말하는가?
우선 데이터베이스에서 일관된 상태란 다음 조건들을 충족하는 상태이다.
- 데이터 무결성 제약 조건(Integrity Constraints) 만족
- 개체 무결성: 모든 테이블의 기본 키(Primary Key)는 널(NULL) 값을 가질 수 없으며, 중복될 수 없다. 각 엔티티(개체)는 고유하게 식별되어야 한다.
- 참조 무결성: 외래 키(Foreign Key)는 참조하는 기본 키의 값이 데이터베이스에 존재하거나, 널(NULL) 값이어야 한다. 즉, 참조하는 데이터가 유효해야 한다. 예를 들어, '주문' 테이블에 있는 고객 ID는 반드시 '고객' 테이블에 존재하는 고객 ID여야 한다.
- 도메인 무결성: 특정 컬럼(속성)의 값은 미리 정의된 도메인(데이터 타입, 길이, 허용 범위 등)을 벗어날 수 없다.
- 사용자 정의 제약 조건: 개발자가 비즈니스 로직에 따라 추가적으로 정의한 모든 규칙(예: 계좌 잔액은 항상 0 이상이어야 한다, 재고 수량은 0 미만이 될 수 없다 등).
- 비즈니스 규칙(Business Rules) 만족
- 예) "계좌 이체 시, 보내는 사람 계좌에서 인출된 금액과 받는 사람 계좌에 입금된 금액은 반드시 같아야 한다." 이 규칙은 데이터베이스에 명시적인 제약 조건으로 정의되지 않을 수 있지만, 트랜잭션이 이 규칙을 위반하지 않도록 설계되어야 한다.
트랜잭션의 일관성 속성은 다음과 같은 의미를 가진다.
- 트랜잭션 시작 전: 데이터베이스는 일관된 상태 A에 있다. (모든 제약 조건과 비즈니스 규칙을 만족한다.)
- 트랜잭션 실행 중: 트랜잭션이 여러 단계를 거치면서 데이터를 수정할 때, 일시적으로 데이터베이스가 비일관적인 상태가 될 수 있다.
예) A 계좌에서 1000원 인출하는 연산이 성공했지만, B 계좌에 1000원 입금하는 연산이 아직 수행되지 않았다면, 현재 시점에서 전체 금액의 합은 1000원 줄어든 비일관적인 상태다. - 트랜잭션 완료 후 (커밋 시): 트랜잭션 내의 모든 연산이 성공적으로 완료되면, 데이터베이스는 새로운 일관된 상태 B로 전환된다.
만약 트랜잭션 실행 중 오류가 발생하여 모든 연산이 완료되지 못했다면, 트랜잭션은 롤백(Rollback)되어 시작 전의 일관된 상태 A로 되돌아간다.
결론적으로, 트랜잭션은 데이터베이스를 항상 유효하고 논리적으로 올바른 상태에서 시작하여, 다른 유효하고 논리적으로 올바른 상태로만 변경하도록 보장한다. 중간에 잠시 깨진 것처럼 보여도, 최종적으로는 다시 일관된 상태로 되돌리거나, 완전히 새로운 일관된 상태로 만드는 것이라고 이해할 수 있다.
트랜잭션의 동작
데이터베이스는 트랜젝션을 위해 Read(X)와 Write(X)라는 두 가지 연산을 제공한다.
Read(X) : DB에서 X라는 데이터를 읽어서 트랜잭션이 실행되는 메모리의 변수 X에 값을 저장하는 연산
Write(X) : 트랜잭션이 실행되는 메모리에 있는 변수 X의 값을 DB에 전송하여 X라는 데이터를 저장하는 연산
그림으로는 다음과 같이 간단히 표현해볼 수 있다.
이어질 글에서는 트랜잭션의 동시성, 동시성 제어에 대해 다뤄볼 예정이다.