트랜잭션은 DBMS에서 데이터를 다루는 최소 작업 단위로, 여러 쿼리를 각각 독립적으로 수행될 수 있게 하며 장애 발생 시에는 복구 작업 단위가 된다.
1. 특성
- 원자성(Atomic) : 트랜잭션은 더 이상 쪼개질 수 없는 연산으로서 완벽하게 성공 또는 실패여야 한다.
-> 회복 관리자로 원자성 유지
- 일관성(Consistency) : 데이터베이스의 상태는 트랜잭션 수행 전과 후가 항상 같아야 한다.
-> 무결성 제약조건 및 병행 제어로 일관성 유지
- 고립성(Isolation) : 다른 트랜잭션에 영향을 주거나 받아서는 안된다.
-> 병행 제어로 고립성 유지
- 지속성(Durability) : 트랜잭션으로 인해 데이터가 변경될 경우 그 결과가 지속되어야 하며, 장애 발생에도 대처 가능해야 한다.
-> 회복 관리자로 지속성 유지
2. 상태
- 활동(Active) : 트랜잭션이 실행을 시작했거나 실행 중인 상태
- 부분완료(Partially committed) : 트랜잭션의 마지막 연산을 수행한 직후의 상태
- 완료(Committed) : 트랜잭션이 성공적으로 완료되어 commit에 성공한 상태
- 실패(Failed) : 트랜잭션이 장애 및 오류로 인해 실패한 상태로, 롤백(rollback)을 수행 후 철회 상태로 전이됨
- 철회(Aborted) : 롤백 연산으로 인해 트랜잭션 실행 전으로 돌아간 상태
3. 연산
- Commit : 트랜잭션이 성공적으로 수행되어 일관성에 문제가 없을 때, 그 결과를 데이터베이스에 반영하는 연산
- Rollback : 트랜잭션을 실행하기 전 상태로 되돌리는 연산
4. 병행 제어(Concurrency control)
: 다중 사용자 환경에서 둘 이상의 트랜잭션이 동시에 수행되는 경우, 고립성과 일관성을 유지하기 위해 DBMS에서 사용하는 기법
4-1. 문제
- Dirty write : 트랜잭션이 갱신한 내용을 다른 트랜잭션이 덮어씀으로써 무효화되는 경우
- Dirty read : 아직 커밋되지 않은 트랜잭션의 결과를 다른 트랜잭션에서 사용하는 경우
- Non-repeatable read : 트랜잭션에서 같은 데이터를 여러번 읽는 사이에 다른 트랜잭션이 값을 변경하는 경우
- Phantom read : 트랜잭션에서 같은 데이터를 여러번 읽는 사이에 다른 트랜잭션이 새로운 투플을 추가하는 경우
- Cascade rollback : 커밋되지 않은 트랜잭션의 결과를 또다른 트랜잭션이 참조하는 경우 발생 가능
- Cascade rollback 시 회복 불가 : 연쇄 복귀가 이뤄져야 하는 트랜잭션이 이미 완료되어 롤백하지 못하는 경우
4-2. 해결 기법
◆ Lock
: 여러 트랜잭션이 같은 데이터에 대해 동시에 접근하는 것을 제한하는 기법
- 공유락(Shared lock) : 쓰기 작업에 대해서만 접근을 제한
- 배타락(Exclusive lock) : 읽기, 쓰기 모두 접근을 제한
◆ 2-Phase locking
: Lock을 사용하더라도 데이터의 일관성이 결여되는 현상이 발생하는데,
이 기법은 확장 단계(growing phase)에서는 unlock 제한하고 축소 단계(shirink phase)에서는 lock을 제한하는 구조로
serializable을 보장한다. 단, 데드락(deadlock) 위험에 노출된다.
◆ 고립 수준
: 모든 레벨에서 공통적으로 쓰기 연산에 대해 배타락을 사용하며 고립 레벨에 따라 Select 쿼리 시 공유락의 단위가 달라진다.
- Level_0(Read uncommitted) : 공유락을 사용하지 않는 레벨
- Level_1(Read committed) : Select 쿼리 단위로 공유락을 사용하는 레벨
- Level_2(Repeatable read) : 사용하는 데이터에 공유락을 사용해 트랜잭션 종료 시까지 유지
- Level_3(Serializable) : 공유락을 테이블 단위로 설정하여 사용하는 레벨
5. 회복(Recovery)
: 장애가 발생하기 전의 상태로 되돌려 데이터베이스의 일관성을 유지하는 것
- 덤프(Dump) : 일정 간격으로 데이터베이스의 복사본을 만들어 두고, 필요 시에 원복시키는 방식
- 로그(Log) : 변경 연산을 수행할 때마다 로그 파일에 기록하고, 필요 시에 취소 또는 재수행하는 방식
˙지연 갱신(Deffered update) : 커밋 전에는 로그 파일에만 기록하고 커밋 후에 데이터베이스에 반영하는 방식
˙즉시 갱신(Immediate update) : 커밋 전에 연산 결과를 로그에 기록하고 데이터베이스에 반영하는 방식
- 체크 포인트(Check-point) : 로그 파일로 회복 시에 성공된 트랜잭션을 제외한 연산만을 복구하기 위한 것으로 변경 내용을 데이터베이스에 반영한 후에 다음 트랜잭션에 체크포인트를 설정한다.
˙체크 포인트 이전의 커밋 기록 : 정상 완료
˙체크 포인트 이후의 커밋 기록 : 아직 데이터베이스에 반영되지 못했으므로 REDO 연산 수행
˙커밋 기록이 없고 즉시 갱신 방식인 경우 : 로그 파일 기록과 데이터 반영이 동시에 이뤄질 수 있으므로 UNDO 연산 수행
'Database' 카테고리의 다른 글
무결성 제약조건( Integrity constraint ) (0) | 2021.08.29 |
---|---|
정규화( Normalization ) (0) | 2021.08.29 |
데이터베이스( Database ) (0) | 2021.08.29 |
인덱스( Index ) (0) | 2021.08.29 |
SQL( Structured Query Language ) (0) | 2021.08.27 |