트랜잭션 (Transaction)
트랜잭션이란 데이터베이스의 상태를 변경시키는 한 개의 논리적 작업의 단위를 뜻한다.
트랜잭션의 성질
원자성 (Atomicity)
한개의 트랜잭션 연산은 데이터베이스에 모두 반영되거나, 아무것도 반영되지 않아야 한다(All or nothing).
즉, 트랜잭션 내에서 한개의 연산이라도 오류가 발생한다면, 해당 트랜잭션은 모두 취소 되어야 한다.일관성 (Consistency)
특정 트랜잭션이 수행되기 전에 데이터베이스가 일관된 상태를 가진 경우, 트랜잭션 실행 후에도 데이터베이스는 일관된 상태를 가져야 한다.
트랜잭션이 실행되는 동안, 데이터베이스는 일시적으로 일관된 상태를 유지하지 못할 수 있다.독립성 (Isolation)
한개의 트랜잭션이 실행되는 동안 다른 트랜잭션은 해당 연산에 접근할 수 없다.
수행중인 트랜잭션이 완료되기 전까지, 다른 트랜잭션에서 해당 결과를 참조 할 수 없다.
여러 트랜잭션이 동시에 처리 될 때, 최종 결과는 임의의 순서로 트랜잭션들을 실행한 결과와 같아야 한다.지속성 (Durability)
트랜잭션이 성공적으로 완료되었다면, 해당 결과는 시스템이 고장나더라도 반영되어야 한다.
컴퓨터 시스템에 오류가 있어도 해당 결과는 손실되지 않아야 한다.
트랜잭션 연산 종류
Commit
트랜잭션 작업이 성공적으로 끝나고 데이터베이스가 다시 일관된 상태로 돌아갔을 때 관리자에게 해당 작업이 완료되었음을 알려주는 연산Abort
트랜잭션이 부분적으로 완료된 경우, 원자성을 보장하기 위해 해당 트랜잭션이 수행한 모든 연산을 취소하는 연산
트랜잭션의 상태
- Active : 트랜잭션이 실행 중인 상태
- Failed : 실행 중 오류가 발생해서 중단된 상태
- Aborted : 비정상 종료로 인해 Rollback 연산을 수행한 상태
- Partially Committed : 트랜잭션 연산이 성공적으로 끝났지만, Commit 연산이 실행되기 전 상태
- Committed : 트랜잭션이 성공적으로 종료되어 Commit 연산을 수행한 상태
동시성 제어 (Concurrency control)
트랜잭션들을 동시에 실행한 것과 순차적으로 실행간의 동일한 결과를 보장한다.
Locking
- 동시성 제어를 위해 널리 사용되는 방법
- Lock은 Shared-lock(S-lock, 읽기), eXclusive-lock(X-lock, 쓰기) 모드가 있음
- 트랜잭션은 값을 수정하기 위해 데이터베이스에 접근할 때, X-lock을 요청
- 트랜잭션은 값을 읽기 위해 데이터베이스에 접근할 때, S-lock을 요청
- 트랜잭션은 연산을 하기전에 항상 lock을 먼저 획득해야 함
- 한 개의 트랜잭션이 lock을 획득한 경우, 해당 항목에 대한 lock은 잠김 상태
- 트랜잭션이 해당 항목에 대한 액세스를 마치면 잠금을 해제
2-phase locking protocol
잠금 확장(expanding) 단계 (1단계)
이 단계에서 트랜잭션은 데이터 항목에 대한 새로운 잠금 요청은 가능하지만, 잠금을 해제할 수는 없음
S-lock, X-lock을 요청하거나, S-lock을 X-lock으로 변환하는 것만 허용잠금 계약(Contracting) 단계 (2단계)
이 단계에서는 잠금을 해제 할 수는 있지만, 새 잠금을 요청할 수는 없음
잠금을 부분적으로 해제하거나, 트랜잭션 완료시 한번에 모두 해제할 수 있음
S-lock, X-lock을 해제하거나, X-lock을 S-lock으로 변환하는 것만 허용
Deadlock
락 기반 프로토콜에서 발생할 수 있음
두 개이상의 트랜잭션이 서로 잠금을 요청하는 동안 계속 대기상태에 있음
해결하기 위해 데드락 예방 방식이나, 데드락 해결 방식을 사용해야 함