하나의 트랜잭션이 성공적으로 끝났고, 데이터베이스가 일관성있는 상태에 있을 때. 하나의 트랜잭션이 끝났다는 것을 관리자에게 알려주기 위함.
연산을 사용하면 트랜잭션이 로그에 저장
- 활동(Active) : 트랜잭션이 실행중인 상태
- 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
- 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
- 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산 이 실행되기 직전의 상태
- 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태
"다시하다"라는 의미. 기본적으로 복구의 역할을 함.
"원상태로 돌리다"라는 의미. 작업 롤백과 읽기 일관성, 복구를 한다. Redo와의 차이점은 Redo는 사용자가 했던 작업을 그대로 다시 해서 복구하는 반면, Undo는 사용자가 했더 작업을 반대로 진행한다.
- 상태 변화 -> SQL 질의어를 통해 DB에 접근하는 것
1. SELECT 2. INSERT 3. DELETE 4. UPDATE
- 작업 단위 -> 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것
상황예시) 사용자 A가 사용자 B에게 만원을 송금한다. * 필요한 DB작업 1. 사용자 A의 계좌에서 만원을 차감한다. : UPDATE문 사용 2. 사용자 B의 계좌에서 만원을 추가한다. : UPDATE문 사용 * 현재 작업 단위 : 출금 UPDATE문 + 입금UPDATE문 = 트랜잭션 하나 - 위 두 쿼리문 모두 성공적으로 완료되어야만 '하나의 작업(트랜잭션)"이 완료된다. **'Commit'** - 작업 단위에 속하는 쿼리 중 하나라도 실패하면 모든 쿼리문을 취소하고 이전 상태로 되돌려야 한다. **'Rollback'**
원자성(Atomicity)
: All or Nothing, 트랜잭션이 DB에 모두 반영되거나, 혹은 전혀 반영되지 않아야 한다.
일관성(Consistency)
: 트랜잭션의 작업 처리 결과는 항상 일관성 있어야 한다.
독립성(Isolation)
: 둘 이상의 트랜잭션이 동시에 병행 실행되고 있을 때, 어떤 트랜잭션도 다른 트랜잭션 연산에 끼어들 수 없다.
지속성(Durability)
: 트랜잭션이 성공적으로 완료되었다면, 결과는 영구적으로 반영되어야 한다. 시스템이 고장나더라고도 데이터베이스에 반영, 손실이 없다. 문제가 만약 생긴다면, DBMS의 회복모듈이 그 상태를 반영한다.
📍 그 전에 알면 좋은 지식
1. DBMS의 구조 : 질의 처리기 + 저장 시스템
- 페이지 버퍼 : DBMS의 저장 시스템에 속하는 모듈. 메인메모리에 유지하는 페이지를 관리하는 모듈, 즉 페이지 버퍼의 모듈에 따라 UNDO, REDO를 결정한다.
왜 UNDO가 필요한가?
INSERT, UPDATE, DELETE 같은 오퍼레이션이 실행될때 버퍼 관리자의 정책에 따라서 디스크에 수정된 페이지가 반영될 수 있다. 여기서 중요한건 아직 트랜잭션이 커밋되지 않았더라도 수정된 페이지가 디스크에 반영될 수 있다는 것이다
메모리 버퍼의 크기가 커야한다. : 수정된 페이지들이 트랜잭션이 커밋되야지만 디스크에 반영된다면 트랜잭션이 진행되는 동안에는 메모리에 모든 수정된 페이지가 저장되기 때문이다.
수정된 페이지가 디스크에 반영되는 시점을 기준으로 두 가지 정책이 존재한다.
커밋한 트랜잭션의 수정 사항을 재반영하는 방식으로 복구 작업을 실행한다.
LOCK
(동시성 제어, 병행 제어)Lock-based
protocols하나의 변수
락 테이블
에 유지베타락
을 요청공유락
을 요청Timestamp-based
concurrency control(non-lock concurrency control)timestame를 사용해서 트랜잭션을 다룸
timestamp : 모든 트랜잭션이 가지게 됨. 고유한 값을 가지며 나중에 시작한 트랜잭션이 더 큰 timestamp를 가지게 된다. 따라서 트랜잭션의 timestamp끼리 값을 비교할 수 있고 서로 충돌이 발생했을 때 어떤 작업이 먼저 수행되어야 할 지를 알 수 있다.
데이터베이스의 RTS : 해당 데이터를 READ할 때마다 갱신됨
데이터베이스의 WTS : 해당 데이터를 WRITE할 때마다 갱신됨