티스토리에 저장했던 글을 옮겼습니다.
https://mrcocoball.tistory.com/43?category=1080971
1. 트랜잭션(Transaction)의 정의
(1) 정의
- "쪼갤 수 없는 업무 처리의 최소 단위"를 의미
- 은행을 예로 들면 A가 B에게 돈을 지급하고 B가 돈을 받을 경우
이 거래 기록은 하나의 트랜잭션을 구성
- A가 B에게 돈을 지급했는데 B가 돈을 받지 못했다면 거래가 성립되지 않기 때문에
이 둘을 별개로 분리할 수 없음
- 데이터베이스 시스템에서 병행 제어 및 회복 작업 시 처리되는 작업의 논리적인 단위
- 사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위
- 트랜잭션 처리가 정상적으로 완료된 경우
커밋(commit)
오류가 발생할 경우 원래 상태대로 롤백(rollback)
진행
- 영어로 간단히
Tx
로 표기
TPS (Transaction Per Second)
: 1초 당 처리할 수 있는 트랜잭션의 개수
(2) 목적
- 데이터 부정합을 방지하고자 할 때 사용
(데이터베이스 서버에 다중 / 동시 엑세스할 경우나 갱신 처리 과정에서 중단되는 경우 등)
- 데이터베이스 기능 중 트랜잭션을 조작하는 기능은 데이터베이스 완전성 유지를 확신하게 함
- 단일 트랜잭션은 데이터베이스 내에 읽거나 쓰는 여러개 쿼리를 요구
- 트랜잭션은 서로 간섭하지 않아야 함
- 쿼리 하나가 실패한 경우 데이터베이스 시스템은 전체 트랜잭션 혹은 실패한 쿼리를 롤백
(3) 특징
- 트랜잭션의 대표적인 이점 중 하나는 무정지성의 향상
- 운영체제 장애 등의 서버 장애가 발생, 그로부터 데이터베이스를 재가동한 때에
'장애 직전까지의 커밋 결과'를 손실하지 않고 마치는 것이 가능
- 트랜잭션 대응의 데이터베이스에서는
REDO 로그
(데이터베이스에서 수행한 작업을 다시 실행하는 로그)를 이용하여 무정지성을 보장
REDO 로그
: 데이터 파일에 커밋을 할 때마다 기록을 하는 것이 아니라 캐시 영역에 보관해두고
정기적으로 디스크에 기록하는 동작을 취하는데 REDO 로그
파일은 최신 커밋 정보를 가지고 있음 (본체는 비교적 오래된 데이터)
- 서버 장애 등으로 데이터베이스를 재기동해야 할 경우
REDO 로그
의 내용을 데이터 파일에 적용시켜 나감으로서 충돌을 복구함(Clash Recovery
)
2. 트랜잭션의 조건 - ACID
(1) 개요
- 데이터베이스의 트랜잭션은 사용자가 시스템에 대한 서비스 요구 시
시스템이 응답하기 위한 상태 변환 과정의 작업 단위
- 트랜잭션이 안전하게 수행되기 위해서는
ACID 조건
을 충족해야 함
(2) 원자성 (Atomicity)
- 하나의 트랜잭션이 더 이상 작게 쪼갤 수 없는 최소한의 업무 단위어야 한다는 것
- 트랜잭션이 데이터베이스에 모두 반영되던지 아니면 전혀 반영되지 않아야 함 (All or Nothing)
- 트랜잭션 실행 도중 문제가 발생했을 때 중단된 상태가 아닌 모두 실패 또는 모두 완성되거나 해야 함
- 예시 : 트랜잭션 100개 명령어 중 99개 완료, 1개 실패 시 무조건 실패로 간주
- 트랜잭션이 중간에 끊기게 되면 어디서부터 이어서 수행되어야 하는지 모르기 때문에 이를 방지하고자 원자성을 지니게 됨
- 원자성의 보장
- 수행하고 있는 트랜잭션에 의해 변경된 내역을 유지,
이전에 커밋된 상태를 임시 영역에 따로 저장하여 원자성을 보장
- 현재 수행 중인 트랜잭션에서 오류 발생 시 현재 내역을 삭제, 임시 영역에 저장했던 상태로 롤백
롤백 세그먼트(rollback segment)
이전 데이터들이 임시로 저장되는 영역
세이브 포인트(save point)
확실한 부분에 대해서는 롤백이 되지 않도록 지정하는 중간 저장 지점
(트랜잭션의 길이가 길어지게 될 경우 롤백 과정 역시 길어지기 때문에 도입)
(3) 일관성 (Consistency)
- 트랜잭션이 완료된 결과값이 일관적인 DB 상태를 유지하는 것
- 시스템이 가지고 있는 고정 요소는 수행 전과 후의 상태가 같아야 하며,
트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것
- 트랜잭션이 진행되는 동안 데이터베이스가 변경되더라도 업데이트된 데이터베이스로
트랜잭션이 진행된 것이 아닌, 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행
- 트랜잭션 수행이 보존해야 할 일관성은 기본 키, 외래 키 제약과 같은
명시적 무결성 제약 조건 뿐만이 아닌 비명시적인 일관성 조건도 포함됨
- (예시 : A에서 B 계좌로 돈을 송금하는 트랜잭션이라면
송금 전과 송금 후의 A, B 계좌의 총액이 같아야 한다)
- 일관성의 보장
- 트랜잭션 수행 전/후에 데이터 모델의 모든 제약 조건(무결성 제약 조건)을 만족하는 것으로 보장
- Movie, Video 테이블이 있을 때 Video 테이블의 PK가 외래 키로 존재한다면 Movie 테이블의 제약 조건이 바뀌면 Video 테이블에서도 PK가 변경되어야 함
- 어떤 이벤트와 조건이 발생했을 때,
트리거(Trigger)
를 통해 보장
트리거 (Trigger)
데이터베이스 시스템이 자동적으로 수행할 동작을 명시할 때 사용, 어떤 행위의 시작을 알리는 것
(4) 고립성 (Isolation)
- 하나의 트랜잭션 수행 시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는 것
- 트랜잭션끼리는 서로를 간섭할 수 없으며, 트랜잭션이 실행되는 도중에 변경한 데이터는 트랜잭션이 완료될 때까지 다른 트랜잭션이 참조하지 못하게 함
- 데이터베이스는 클라이언트들이 같은 데이터를 공유하는 것이 목적이므로 여러 트랜잭션이 동시에 수행되어야 함
- 이 때 트랜잭션은 상호 간의 존재를 모르고 독립적으로 수행되어야 하며, 다른 트랜잭션의 수행에 영향을 받지 말아야 함
- DBMS의 병행 제어 모듈이 트랜잭션의 고립성을 보장함
- 고립성의 보장
공유 록(shared_lock)
트랜잭션에서 데이터를 읽을 때, 여러 트랜잭션이 읽을 수는 있도록 허용 (읽기 전용)
배타 록(exclusive_lock)
데이터를 쓸 때는 다른 트랜잭션이 읽을 수도 쓸 수도 없도록 함
- 읽기 쓰기 작업이 끝나면
unlock
을 통해 다른 트랜잭션이 lock
을 할 수 있도록 데이터에 대한 잠금을 해제
- 단,
lock
과 unlock
을 잘못 사용하면 데드락(deadlock)
상태가 되어 모든 트랜잭션이 아무 것도 수행할 수 없는 상태가 될 수 있음
(5) 지속성 (Durability)
- 트랜잭션의 성공 결과 값은 장애 발생 후에도 변함없이 보관되어야 한다는 것
- 트랜잭션이 정상적으로 완료된 경우에는 버퍼의 내용을 하드디스크(데이터베이스)에 확실히 기록해야 함
부분 완료(Partial Commit)
된 경우에는 작업을 취소 (Aborted)
하여야 함
- 영속성이라고도 표현하기도 함
3. 트랜잭션의 과정
(1) 개요
- 작업의 안전성을 확보하기 위해서 데이터베이스는 처리 과정이 모두 성공했을 때만
최종적으로 데이터베이스에 결과값을 반영
- 트랜잭션이 중단되거나 서버/하드웨어 고장 등으로 작업에 오류가 생길 시
트랜잭션 작업 전으로 돌아가게 됨
(2) 상태
활동 (Active)
: 트랜잭션이 실행 중인 상태
실패 (Failed)
: 트랜잭션 실행에 오류가 발생하여 중단된 상태
철회 (Aborted)
: 트랜잭션이 비정상적으로 종료되어 롤백 연산을 수행한 상태
부분 완료 (Partial Committed)
: 트랜잭션의 마지막 연산까지 실행했으나 커밋 연산이 실행되기 직전의 상태
완료 (Committed)
: 트랜잭션이 성공적으로 종료되어 커밋 연산을 실행한 후의 상태
(3) 연산
- 사용자가 적은 쿼리문과 데이터를 최종적으로 데이터베이스에 반영하는
커밋(commit)
과 실패했을 시 시점으로 돌아가는 롤백(rollback)
이 있음
커밋 (commit)
- 모든 작업들을 정상적으로 처리하겠다고 확정하는 명령어이며
처리과정을 데이터베이스에 영구적으로 저장하는 것
- 커밋 수행 시 하나의 트랜잭션 과정을 완전히 종료하는 것
- 커밋 수행 시 이전 데이터가 완전히 업데이트 됨
UPDATE
문으로 데이터를 갱신한 후 DELETE
문으로 기존 데이터를 삭제한 후
INSERT
문으로 데이터를 삽입
- 상기 과정이 오류 없이 진행되었을 경우 모든 작업을 데이터베이스에 영구 저장하라는 명령으로 커밋을 수행
롤백 (rollback)
- 작업 중 문제가 발생하여 트랜잭션의 처리과정에서 발생한 변경 사항을 취소하는 명령어
- 트랜잭션의 일부가 정상적으로 처리되더라도 트랜잭션의 원자성을 구현하기 위해 트랜잭션이 행한 모든 연산을 취소하는 특성이 있음
- 트랜잭션이 시작되기 이전의 상태, 즉 마지막 커밋을 완료한 시점으로 돌아가며 커밋하여 저장한 것만 복구
- 롤백 시에는 해당 트랜잭션을 재시작하거나 폐기함
세이브 포인트 (save point)
- '임시저장' '부분저장'과 비슷한 맥락. 전체가 아닌 특정 부분에서 트랜잭션을 취소하기 위해 사용
- 현재의 트랜잭션을 잘게 분할하는 것이 가능
- 여러 개의 SQL 문의 실행을 수행하는 트랜잭션의 경우 사용자가 트랜잭션 중간 단계에서 세이브 포인트를 지정할 수 있음
- 취소하려는 지점을 명시한 뒤 그 지점까지 작업을 취소하는 식으로 사용, 처리한 작업이 롤백됨
레퍼런스
http://wiki.hash.kr/index.php/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98