데이터베이스 트랜잭션
트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위로 묶인 연산들이다. 예를 들어 계좌 A에서 돈을 빼고 계좌 B에 넣는 작업은 두 연산이 함께 성공해야 의미가 있다. 중간에 하나만 끝나면 돈이 사라지거나 생기므로 이를 막아야 한다. ACID는 트랜잭션이 지켜야 할…
주요 장면
대본
트랜잭션이란
트랜잭션은 데이터베이스에서 하나의 논리적 작업 단위로 묶인 연산들이다.
예를 들어 계좌 A에서 돈을 빼고 계좌 B에 넣는 작업은 두 연산이 함께 성공해야 의미가 있다.
중간에 하나만 끝나면 돈이 사라지거나 생기므로 이를 막아야 한다.
ACID 네 가지 속성
ACID는 트랜잭션이 지켜야 할 네 가지 속성이다.
원자성은 모든 연산이 모두 성공하거나 모두 실패함을 뜻한다. 실패하면 원상복구한다.
일관성은 수행 전후에 데이터베이스가 무결성 제약조건을 만족하는 상태를 유지함을 뜻한다.
격리성은 동시에 실행되는 트랜잭션이 서로 간섭하지 않는 것처럼 보이게 함을 뜻한다.
지속성은 COMMIT된 결과가 장애 뒤에도 영구히 남음을 뜻한다. 로그와 백업으로 구현한다.
트랜잭션 상태 전이
트랜잭션은 활동, 부분완료, 완료, 실패, 철회의 상태를 거친다.
모든 연산이 끝나면 부분완료가 되고, 검사를 통과하면 COMMIT으로 완료된다.
연산 중 오류가 나면 실패가 되고, ROLLBACK으로 철회되어 이전 상태로 돌아간다.
이 상태전이도는 답안에서 자주 요구되는 핵심 그림이다.
격리 수준과 허용 현상
격리 수준은 SQL 표준이 정한 네 단계이며, 표는 막는 현상을 보여 준다.
READ UNCOMMITTED는 세 현상을 모두 허용하고, SERIALIZABLE은 모두 막는다.
READ COMMITTED는 Dirty Read만 막고, REPEATABLE READ는 비반복 읽기까지 막는다.
단계가 높을수록 현상은 줄지만 락 대기가 늘어나 동시성이 떨어진다.
2단계 잠금
2단계 잠금은 잠금을 획득하는 확장 단계와 잠금을 해제하는 축소 단계로 나뉜다.
확장 단계에서는 잠금을 얻기만 하고, 축소 단계에 들어가면 새 잠금을 걸 수 없다.
이 규칙을 지키면 동시 실행 결과가 어떤 직렬 실행 결과와 같아진다.
그러나 2PL은 교착 상태를 막지는 못한다. 교착은 대기 그래프 검사나 시간 초과로 따로 처리한다.
핵심 정리
트랜잭션의 핵심을 한 번 정리한다.
원자성과 지속성은 UNDO와 REDO로 장애 복구를 함께 맡는다.
격리성은 격리 수준으로 조절하고, 직렬성은 2PL이 보장한다.
동시성은 MVCC처럼 버전을 두는 방식으로도 높일 수 있다.