트랜잭션 (Transaction)
트랜잭션의 정의
- DB의 논리적 연산 단위, 분할할 수 없는 최소의 단위
- 분리될 수 없는 한 개 이상의 데이터베이스 조작 → 하나 이상의 DML문 포함
- ALL or Nothing ⇒ 어떠한 장애에 의해 어느 쪽으든 모두가 실행이 되지 않으면 실행 이전의 상태로 돌아감
트랜잭션의 특성 (ACID)
- 원자성 (Atomicity)
- 트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전혀 실행되지 않은 상태로 남아있어야 한다. → All or Nothing
- 일관성 (Consistency)
- 트랜잭션 실행 이전 DB의 내용이 올바르다면, 실행 이후에도 DB 내용은 옳은 내용이 있어야 한다.
- 고립성 (Isolation)
- 트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다. ⇒ 트랜잭션 중에 다른 트랜잭션이 끼어들 수 없다.
- Isolation이 낮을 경우 발생하는 문제
- Dirty Read : 다른 트랜잭션에 의해 수행되었지만 커밋 이전의 데이터를 읽는 것
- Non-Repeatable Read : 한 트랙잭션 내에서 같은 쿼리를 2번 수행 했는데, 그 사이에 다른 트랜잭션이 값을 수정/삭제 하여 두 쿼리 결과가 다르게 나타남
- Phantom Read : 한 트랜잭션 내에서 같은 쿼리를 2번 수행했는데, 첫번째 쿼리에서 없던 유령 레코드가 두번째 쿼리에서 나타남
- 지속성 (Durability)
- 트랜잭션이 성공적으로 수행되면 그 내용은 영구적으로 DB에 저장된다.
- cf) Locking (잠금)
COMMIT
- 트랜잭션이 모두 실행되고 문제가 없다고 판단되었을 경우,
COMMIT
명령어를 통해 트랜잭션 완료할 수 있음.
COMMIT 이전 상태
- 메모리 Buffer에만 영향이 있기에 변경 이전으로 복구 가능
- 현재 사용자는 SELECT 문으로 결과 확인 가능 → 다른 사용자는 확인 불가
- 변경된 내용은 잠금(LOCKING)이 설정되어서 다른 사용자가 변경 불가능
UPDATE PLAYER SET HEIGHT = 100;
COMMIT;