병행 수행 (Concurrency Control) 병행 수행은 데이터베이스 관리 시스템(DBMS)에서 여러 사용자가 동시에 데이터에 접근하고 작업을 처리할 수 있도록 하는 기술입니다. 데이터베이스는 여러 사용자가 동시에 데이터를 삽입, 수정, 삭제 등의 작업을 할 때 그 결과가 정확하고 일관성을 유지하도록 보장해야 합니다. 병행 수행은 이러한 동시에 발생하는 작업을 효율적으로 관리하여 데이터 무결성 및 일관성을 유지하는 것을 목표로 합니다.
병행 수행의 필요성
- 성능 향상: 여러 트랜잭션을 동시에 처리하면 시스템 자원을 효율적으로 사용하고 응답 시간을 줄일 수 있습니다.
- 공유 자원의 활용: 다수의 사용자가 동일한 데이터에 접근할 수 있도록 하여 자원을 최대한 활용합니다.
- 데이터 일관성 유지: 동시에 여러 트랜잭션이 실행될 때 일관성을 보장하기 위해서는 적절한 제어가 필요합니다.
병행 수행 문제점
병행 수행에서는 여러 트랜잭션이 동시에 실행될 때 발생할 수 있는 다양한 문제점이 있습니다:
- 갱신 손실 (Lost Update): 두 개 이상의 트랜잭션이 동시에 같은 데이터를 수정하여, 한 트랜잭션의 수정 내용이 다른 트랜잭션의 수정 내용에 의해 덮어씌워지는 문제.
- 모순된 읽기 (Inconsistent Read): 트랜잭션이 데이터를 읽는 동안 다른 트랜잭션이 그 데이터를 수정하여, 읽은 값이 일관성이 없는 상태가 되는 문제.
- 더러운 읽기 (Dirty Read): 한 트랜잭션이 아직 커밋되지 않은 다른 트랜잭션의 데이터를 읽는 경우 발생하는 문제.
- 팬텀 읽기 (Phantom Read): 한 트랜잭션이 데이터베이스에서 특정 조건에 맞는 데이터를 읽는 도중, 다른 트랜잭션이 그 조건에 맞는 새로운 데이터를 삽입 또는 삭제하여 이전에 없던 데이터가 나타나거나 사라지는 문제.
병행 제어 (Concurrency Control) 병행 제어는 병행 수행에서 발생할 수 있는 문제를 해결하기 위한 기법으로, 데이터베이스 시스템이 여러 트랜잭션을 동시에 실행하면서도 데이터의 무결성과 일관성을 보장하기 위한 메커니즘입니다.
병행 제어의 주요 기법
- 로킹 (Locking)
- 공유 락 (Shared Lock): 데이터를 읽을 때 걸리는 락으로, 다른 트랜잭션이 해당 데이터에 쓰기 락을 걸지 못하게 합니다.
- 배타 락 (Exclusive Lock): 데이터를 수정할 때 걸리는 락으로, 다른 트랜잭션이 해당 데이터에 대한 어떤 접근도 하지 못하게 합니다.
- 2단계 락킹 (Two-Phase Locking, 2PL): 트랜잭션이 락을 해제할 때까지 새로운 락을 걸 수 없도록 하는 제어 기법으로, 병행 수행에서 일관성을 보장합니다.
- 낙관적 제어 (Optimistic Concurrency Control)
- 트랜잭션을 실행하는 동안 특별한 제어 없이 자유롭게 수행하게 한 후, 트랜잭션 종료 시점에 충돌 여부를 확인하고 충돌이 발생하면 트랜잭션을 롤백하는 방식입니다. 충돌이 적을 것으로 예상되는 환경에서 유용합니다.
- 타임스탬프 기법 (Timestamp Ordering)
- 각 트랜잭션에 고유한 타임스탬프를 부여하고, 트랜잭션의 시작 순서대로 처리하는 방식입니다. 이를 통해 트랜잭션 간의 충돌을 예방할 수 있습니다.
- 다중 버전 병행 제어 (MVCC, Multi-Version Concurrency Control)
- 데이터를 수정할 때 새로운 버전을 생성하고, 각 트랜잭션은 수정되기 전의 데이터를 읽게 하여 충돌을 최소화하는 방식입니다. 주로 PostgreSQL과 같은 데이터베이스에서 사용됩니다.
병행 제어의 목표
병행 제어는 트랜잭션 간의 충돌을 최소화하면서도 다음과 같은 데이터베이스의 ACID 속성을 유지하는 것을 목표로 합니다:
- Atomicity (원자성): 트랜잭션이 완전히 완료되거나, 실패 시 롤백되어야 합니다.
- Consistency (일관성): 트랜잭션이 실행된 후 데이터베이스는 일관된 상태여야 합니다.
- Isolation (고립성): 한 트랜잭션의 중간 결과는 다른 트랜잭션에서 볼 수 없어야 합니다.
- Durability (지속성): 커밋된 트랜잭션의 결과는 영구적으로 반영되어야 합니다.
병행 제어 기법을 적절하게 적용함으로써 여러 트랜잭션이 동시에 실행될 때도 데이터베이스의 일관성과 무결성을 유지할 수 있습니다.
연쇄 복귀
연쇄 복귀 (Cascading Rollback)는 트랜잭션 처리 과정에서 발생할 수 있는 오류 상황 중 하나로, 한 트랜잭션의 실패가 다른 트랜잭션의 연쇄적인 실패를 초래하는 상황을 말합니다. 이 현상은 트랜잭션 간에 의존성이 있을 때 발생할 수 있습니다.
연쇄 복귀의 발생 과정
연쇄 복귀는 다음과 같은 경우에 발생할 수 있습니다:
- 의존성 관계: 한 트랜잭션이 다른 트랜잭션의 결과에 의존하는 경우, 즉 트랜잭션 A가 트랜잭션 B가 생성한 데이터를 사용하고, 트랜잭션 C가 트랜잭션 A의 데이터를 사용하는 식으로 연결된 상태입니다.
- 롤백 전파: 만약 트랜잭션 B가 실패하거나 롤백되면, 트랜잭션 A와 트랜잭션 C도 그 영향을 받아야 합니다. 트랜잭션 A는 트랜잭션 B의 결과를 참조했기 때문에, B의 롤백이 발생하면 A 역시 롤백되어야 하며, 이로 인해 A의 결과를 사용한 트랜잭션 C도 롤백됩니다.
- 연쇄적인 롤백: 하나의 트랜잭션의 실패가 여러 다른 트랜잭션에 전파되어 결국 여러 트랜잭션이 연속적으로 롤백되는 현상이 발생합니다.
예시
다음과 같은 상황을 생각해볼 수 있습니다:
- 트랜잭션 T1이 데이터베이스에서 데이터를 읽고 그 데이터를 수정합니다.
- 트랜잭션 T2는 T1에서 수정한 데이터를 사용하여 추가적인 작업을 수행합니다.
- 트랜잭션 T3는 T2의 결과를 사용하여 다른 데이터를 처리합니다.
만약 T1에서 오류가 발생하여 롤백하면, T2는 T1의 결과를 사용했기 때문에, T2 역시 롤백되어야 합니다. T2의 롤백은 T3에도 영향을 미치게 되어, T3 역시 롤백됩니다. 이처럼 하나의 트랜잭션 실패가 다른 트랜잭션들에 연쇄적으로 영향을 미치는 것이 연쇄 복귀입니다.
연쇄 복귀 방지 방법
연쇄 복귀를 방지하기 위한 주요 방법은 **엄격한 2단계 잠금(Strict Two-Phase Locking, Strict 2PL)**과 트랜잭션 격리성 강화입니다.
- 엄격한 2단계 잠금 (Strict 2PL): 트랜잭션이 커밋될 때까지 모든 잠금을 유지하여, 트랜잭션이 커밋되기 전에 다른 트랜잭션이 해당 데이터를 참조하지 못하도록 하는 방법입니다. 이를 통해 중간에 실패한 트랜잭션이 다른 트랜잭션에 영향을 미치지 않게 합니다.
- 트랜잭션 격리성 강화: 트랜잭션 간의 간섭을 최소화하기 위해 격리 수준을 높이는 방법도 있습니다. 예를 들어, Serializable 격리 수준을 사용하면 트랜잭션 간의 완전한 독립성을 보장합니다.
'정보처리기사' 카테고리의 다른 글
OSI 7계층의 네트워킹 장비 및 주요 프로토콜 (0) | 2024.09.26 |
---|---|
보안 공격 기법 (3) | 2024.09.24 |
해시충돌 해결법과 예제 (0) | 2024.09.24 |
SDLC 와 Secure SDLC 비교하기 (0) | 2024.04.25 |