01 트랜잭션
트랜잭션의 개념
데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위를 의미합니다. 이러한 작업들은 여러 개의 쿼리들로 이루어지며, 모두 성공적으로 완료되거나, 아니면 전혀 적용되지 않아야 합니다. 중간 단계에서 실패하면 이전의 상태로 롤백되어야 합니다.
트랜잭션의 특성
원자성(Atomicity):
- 트랜잭션은 하나의 논리적인 작업 단위로 간주됩니다.
- 모든 연산이 성공적으로 수행되거나 전혀 수행되지 않아야 합니다.
- 하나의 연산이라도 실패하면 이전 상태로 롤백되어야 합니다.
일관성(Consistency):
- 트랜잭션이 실행되기 전과 실행된 후의 데이터베이스 상태는 항상 일관성이 있어야 합니다.
- 트랜잭션 실행 전과 후에 데이터베이스에 정의된 규칙들을 만족해야 합니다.
격리성•독립성(Isolation):
- 여러 개의 트랜잭션이 동시에 실행될 때, 각각의 트랜잭션은 서로에게 영향을 주지 않고 독립적으로 실행되는 것처럼 보여야 합니다.
- 즉, 다른 트랜잭션의 작업이 완료되기 전까지는 해당 트랜잭션의 중간 상태가 다른 트랜잭션에 노출되지 않아야 합니다.
지속성(Durability):
- 트랜잭션이 성공적으로 완료되면, 그 결과는 영구적으로 데이터베이스에 반영되어야 합니다.
- 시스템 장애가 발생하더라도 데이터베이스는 복구되어 트랜잭션이 적용된 상태를 유지해야 합니다.
트랜잭션과 연산
트랜잭션은 이러한 연산들의 논리적인 그룹을 형성합니다. 트랜잭션은 다수의 연산들로 이루어져 있지만, 이들 연산은 하나의 원자적인 작업 단위로 동작해야 합니다
트랜잭션의 상태
활성(Active) 상태:
- 트랜잭션이 실행되고 있는 상태를 말합니다.
- 트랜잭션이 시작되면서 이 상태가 됩니다.
부분 완료(Partially Committed) 상태:
- 트랜잭션이 모든 연산을 성공적으로 수행했지만, 아직 커밋되지 않은 상태를 말합니다.
- 트랜잭션이 완료되기 직전, 커밋을 실행하기 전에 이 상태가 됩니다.
완료(Committed) 상태:
- 트랜잭션이 모든 연산을 성공적으로 수행하고, 커밋되어 데이터베이스에 결과가 반영된 상태를 말합니다.
- 트랜잭션이 성공적으로 완료되면, 지속성(Durability)을 만족하여 데이터베이스에 영구적으로 반영됩니다.
실패(Failed) 상태:
- 트랜잭션이 비정상적으로 중단되거나, 하나 이상의 연산이 실패하여 롤백이 필요한 상태를 말합니다.
- 트랜잭션 중간에 오류가 발생하거나, 시스템 장애가 발생할 경우 이 상태가 됩니다.
02 장애와 회복
장애의 유형
데드락(Deadlock):
- 두 개 이상의 트랜잭션이 서로가 소유한 리소스를 기다리며 무한히 대기하는 상태를 말합니다.
- 각 트랜잭션은 다른 트랜잭션이 소유한 리소스를 요청하고, 해당 리소스를 얻기 위해 대기합니다.
- 이러한 상태에서는 어떤 트랜잭션도 진행할 수 없어서 시스템이 정지할 수 있습니다.
차단(Block):
- 트랜잭션이 특정 데이터를 다른 트랜잭션에 의해 사용 중인 상태에서 더 이상 진행하지 못하는 상태를 말합니다.
- 다른 트랜잭션에 의해 사용 중인 데이터에 접근하려고 할 때, 해당 데이터에 대한 락(Lock)이 걸려있는 경우 발생합니다.
비정상적인 종료(Abort):
- 트랜잭션이 실행 중 오류를 발생하거나, 데이터 무결성을 위반하여 롤백되는 상태를 말합니다.
- 트랜잭션 실행 중 발생한 예외나 오류로 인해 트랜잭션이 취소되고, 이전 상태로 롤백됩니다.
손실된 업데이트(Lost Update):
- 두 개 이상의 트랜잭션이 동일한 데이터를 동시에 수정하려고 할 때 발생하는 상태입니다.
- 한 트랜잭션이 데이터를 수정한 후, 다른 트랜잭션이 해당 데이터를 수정하면, 첫 번째 트랜잭션의 변경 내용이 무시되어 손실됩니다.
중복 입력(Duplicate Input):
- 트랜잭션이 중복된 데이터를 여러 번 입력하는 상태를 말합니다.
- 예를 들어, 중복으로 주문이 발생하여 동일한 제품이 여러 번 주문되는 경우가 이에 해당합니다.
데이터베이스의 저장 연산
로그 기록(Logging):
- 트랜잭션이 실행되는 동안 모든 데이터 변경 사항들이 로그에 기록됩니다. 이 로그는 트랜잭션의 연산들과 그에 따른 데이터 변경을 기록하는 일종의 저널(journal)로 동작합니다.
변경 사항 적용(Applying Changes):
- 트랜잭션에서 수행한 변경 사항들이 실제 데이터베이스에 적용됩니다.
- 로그에 기록된 데이터 변경 사항들은 변경되기 전의 상태에서부터 순차적으로 적용되어 최종적인 트랜잭션의 결과가 반영됩니다.
커밋(Commit):
- 트랜잭션이 성공적으로 완료되고, 데이터베이스에 모든 변경 사항이 적용되면, 트랜잭션의 커밋이 수행됩니다.
- 이 단계에서 트랜잭션은 더 이상 롤백될 수 없고, 해당 트랜잭션에서 수행한 변경 사항들이 영구적으로 데이터베이스에 저장됩니다.
회복 기법
로그 기반 회복 (Log-based Recovery):
- 로그 기반 회복은 트랜잭션 실행 중에 발생한 변경 사항들을 로그에 기록하여 장애 발생 시 이를 활용하여 회복하는 방법입니다.
- 트랜잭션 실행 중에 변경된 데이터의 원래 값(이전 상태)을 로그에 저장합니다.
- 장애가 발생한 후에는 로그를 분석하여 각 트랜잭션의 이전 상태로 롤백하거나 커밋된 트랜잭션의 변경 사항을 데이터베이스에 재적용하여 회복합니다.
체크포인트 기반 회복 (Checkpoint-based Recovery):
- 체크포인트 기반 회복은 주기적으로 체크포인트를 설정하여 트랜잭션의 상태를 기록하는 방법입니다.
- 일정한 시점에서 데이터베이스 상태를 체크포인트로 지정하여 로그에 그 시점까지의 모든 트랜잭션을 기록합니다.
- 장애가 발생한 경우, 최근의 체크포인트 이후로만 로그를 분석하여 회복 작업을 수행하므로 복구 시간을 단축할 수 있습니다.
03 병행 제어
병행 수행과 병행 제어
Lock 기반 병행 제어:
- Lock은 트랜잭션이 데이터를 사용할 때 다른 트랜잭션으로부터 해당 데이터의 접근을 막는 방법입니다.
- 트랜잭션이 데이터를 읽거나 수정하려고 할 때 Lock을 요청하고, 다른 트랜잭션이 해당 데이터에 대한 Lock을 가지고 있으면 대기합니다.
- Lock을 획득한 트랜잭션이 작업을 완료하면 Lock을 해제하여 다른 트랜잭션이 접근할 수 있도록 합니다.
격리 수준(Isolation Level):
- 격리 수준은 트랜잭션들이 서로에게 어떤 정도로 영향을 주고 받는지를 결정하는 설정입니다.
- 가장 높은 격리 수준은 Serializable로, 가장 엄격하게 트랜잭션 간 상호작용을 제어합니다. 하지만 성능에는 영향을 미칠 수 있습니다.
- 다른 격리 수준으로는 Read Committed, Read Uncommitted, Repeatable Read 등이 있으며, 각각 다른 수준의 병행 제어를 제공합니다.
타임스탬프(Timestamp) 기반 병행 제어:
- 트랜잭션들에게 고유한 타임스탬프를 부여하여, 각 트랜잭션이 어떤 순서로 실행되는지를 관리하는 방법입니다.
- 동시에 실행되는 트랜잭션들의 타임스탬프를 비교하여 충돌을 감지하고, 충돌을 최소화하는 방향으로 스케줄링합니다.
병행 수행의 문제
데드락(Deadlock):
- 두 개 이상의 트랜잭션이 서로가 소유한 리소스를 기다리며 무한히 대기하는 상태를 말합니다.
- 서로가 필요로 하는 리소스를 동시에 소유하고 있어서 해당 리소스를 얻기 위해 계속 대기하다가 진행하지 못하는 상황이 발생합니다.
데이터 읽기 시의 갱신 문제(Read-Modify-Write Problem):
- 한 트랜잭션이 데이터를 읽은 후, 다른 트랜잭션이 해당 데이터를 수정하고 커밋하는 경우, 읽기 트랜잭션은 수정된 내용을 무시하고 이전 값을 사용하는 문제가 발생합니다.
손실된 업데이트(Lost Update):
- 두 개 이상의 트랜잭션이 동일한 데이터를 동시에 수정하려고 할 때, 마지막에 수행된 트랜잭션이 이전 트랜잭션의 변경 내용을 덮어씌워버리는 문제가 발생합니다.
Dirty Read:
- 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 변경 사항을 읽는 문제가 발생합니다.
- 아직 확정되지 않은 변경 사항을 읽으면, 그 변경 사항이 롤백될 경우 데이터의 무결성이 깨질 수 있습니다.
Non-repeatable Read:
- 한 트랜잭션이 동일한 쿼리를 두 번 이상 실행할 때, 첫 번째 쿼리와 두 번째 쿼리 사이에 다른 트랜잭션이 값을 수정하거나 삭제하는 경우, 두 쿼리의 결과가 일치하지 않는 문제가 발생합니다.
트랜잭션 스케줄
트랜잭션 스케줄은 병행 제어(Concurrency Control) 기법에 따라 관리됩니다. 병행 제어는 여러 트랜잭션이 동시에 실행될 때, 데이터 일관성을 유지하고 장애를 방지하기 위해 트랜잭션들 간의 스케줄을 조율하는 메커니즘을 포함합니다.
병행 제어 기법
Lock 기반 병행 제어:
- Lock은 트랜잭션이 데이터를 사용할 때 다른 트랜잭션으로부터 해당 데이터의 접근을 막는 방법입니다.
- 트랜잭션이 데이터를 읽거나 수정하려고 할 때 Lock을 요청하고, 다른 트랜잭션이 해당 데이터에 대한 Lock을 가지고 있으면 대기합니다.
- Lock을 획득한 트랜잭션이 작업을 완료하면 Lock을 해제하여 다른 트랜잭션이 접근할 수 있도록 합니다.
격리 수준(Isolation Level):
- 격리 수준은 트랜잭션들이 서로에게 어떤 정도로 영향을 주고 받는지를 결정하는 설정입니다.
- 가장 높은 격리 수준은 Serializable로, 가장 엄격하게 트랜잭션 간 상호작용을 제어합니다. 하지만 성능에는 영향을 미칠 수 있습니다.
- 다른 격리 수준으로는 Read Committed, Read Uncommitted, Repeatable Read 등이 있으며, 각각 다른 수준의 병행 제어를 제공합니다.
타임스탬프(Timestamp) 기반 병행 제어:
- 트랜잭션들에게 고유한 타임스탬프를 부여하여, 각 트랜잭션이 어떤 순서로 실행되는지를 관리하는 방법입니다.
- 동시에 실행되는 트랜잭션들의 타임스탬프를 비교하여 충돌을 감지하고, 충돌을 최소화하는 방향으로 스케줄링합니다.
'데이터베이스' 카테고리의 다른 글
Ch 11. 보안과 권한 관리 (0) | 2023.08.07 |
---|---|
Ch 9. 정규화 (0) | 2023.07.24 |
Ch 8. 데이터베이스 설계 (0) | 2023.07.22 |
Ch 7. 데이터베이스 언어 SQL (0) | 2023.07.21 |
Ch 6. 관계 데이터 연산 (0) | 2023.07.10 |