
병행 제어(Concurrency Control), 데이터베이스 시스템에서 여러 트랜잭션이 동시에 실행될 때 발생할 수 있는 문제를 방지하기 위해 사용되는 메커니즘입니다. 병행 실행은 시스템의 자원 활용도를 극대화하고 성능을 향상시키는 데 유용하지만, 동시에 데이터 일관성을 저해할 가능성이 있습니다. 이를 효과적으로 관리하기 위해 병행 제어가 필수적입니다.
병행 제어의 필요성
-
데이터 일관성 유지: 여러 트랜잭션이 동일한 데이터를 동시에 갱신하려고 하면 데이터 불일치가 발생할 수 있습니다. 병행 제어는 이러한 문제를 방지합니다.
-
데이터베이스 무결성 보장: 트랜잭션의 ACID 속성(Atomicity, Consistency, Isolation, Durability)을 준수하도록 보장합니다.
-
교착 상태 방지: 병행 실행 중 자원 경합으로 인해 트랜잭션이 무한히 대기하는 교착 상태를 방지합니다.
-
갱신 손실 방지: 두 트랜잭션이 동시에 데이터를 변경하면서 하나의 변경이 손실되는 상황을 방지합니다.
병행 처리에서 발생하는 주요 문제점
-
분실된 갱신(Lost Update)
-
두 트랜잭션이 동시에 동일한 데이터를 갱신할 때, 한 트랜잭션의 결과가 다른 트랜잭션의 결과로 덮어써지는 문제입니다.
-
예시: 트랜잭션 A와 B가 동일한 계좌의 잔액을 갱신하려고 할 때, A의 갱신이 B의 갱신으로 인해 사라질 수 있습니다.
-
-
모순성(Inconsistency)
-
병행 실행 중 하나의 트랜잭션이 데이터를 읽고, 다른 트랜잭션이 해당 데이터를 갱신하면서 데이터 불일치가 발생하는 문제입니다.
-
예시: 재고 관리 시스템에서 하나의 트랜잭션이 재고 수량을 조회하는 동안 다른 트랜잭션이 재고 수량을 변경하면, 잘못된 결과를 초래할 수 있습니다.
-
-
연쇄 복귀(Cascading Rollback)
-
하나의 트랜잭션이 실패하면 이를 의존하는 다른 트랜잭션도 실패하며 롤백이 연쇄적으로 발생하는 문제입니다.
-
예시: 트랜잭션 A가 데이터를 갱신하고, 이를 참조한 트랜잭션 B와 C가 실행되었을 때, A가 실패하면 B와 C도 영향을 받아 롤백됩니다.
-
-
비완료 의존성(Dirty Read)
-
한 트랜잭션이 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 경우 발생하는 문제입니다. 이후 첫 번째 트랜잭션이 롤백되면, 두 번째 트랜잭션이 잘못된 데이터를 기반으로 처리하게 됩니다.
-
예시: 트랜잭션 A가 데이터를 임시 변경하고, 트랜잭션 B가 이를 읽은 후 A가 롤백되면 B의 결과는 무효해집니다.
-
병행 제어의 주요 기법
로킹(Locking)
-
정의: 특정 데이터 항목에 대해 트랜잭션이 독점적으로 접근할 수 있도록 잠금(Lock)을 설정합니다.
-
유형
-
공유 잠금(Shared Lock, S-Lock): 데이터를 읽을 때 설정. 여러 트랜잭션이 동시에 공유 잠금을 가질 수 있음.
-
배타 잠금(Exclusive Lock, X-Lock): 데이터를 읽거나 쓰기 전에 설정. 단일 트랜잭션만 배타 잠금을 가질 수 있음.
-
-
문제점
-
교착 상태가 발생할 수 있음.
-
잠금 경합으로 인해 성능 저하가 발생할 수 있음.
-
낙관적 제어(Optimistic Concurrency Control)
-
정의: 트랜잭션이 데이터를 수정하기 전까지 잠금을 설정하지 않고, 트랜잭션 종료 시점에 충돌을 검사하여 문제가 발생하면 롤백합니다.
-
장점:
-
잠금으로 인한 오버헤드가 적음.
-
트랜잭션 간 경합이 적을 때 효과적.
-
-
단점:
-
충돌이 빈번할 경우 성능 저하 가능.
-
타임스탬프 순서(Time-Stamp Ordering)
-
정의: 각 트랜잭션과 데이터 항목에 타임스탬프를 부여하여 트랜잭션 간 순서를 결정합니다.
-
장점
-
교착 상태가 발생하지 않음.
-
-
단점
-
스케줄링 과정이 복잡하고, 불필요한 롤백이 발생할 수 있음.
-
다중 버전 병행 제어(MVCC)
-
정의: 데이터의 여러 버전을 유지하여 읽기 작업과 쓰기 작업이 충돌하지 않도록 관리합니다.
-
장점:
-
읽기 작업의 성능이 뛰어남.
-
데이터 읽기와 쓰기를 동시에 처리 가능.
-
-
단점:
-
데이터베이스 공간 사용량 증가.
-
버전 관리 복잡성 증가.
-
병행 제어로 해결 가능한 문제
-
갱신 손실(Lost Update): 두 트랜잭션이 동시에 데이터를 갱신하여 한 트랜잭션의 결과가 덮어쓰여지는 문제.
-
더티 읽기(Dirty Read): 한 트랜잭션이 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 문제.
-
비반복 읽기(Non-Repeatable Read): 한 트랜잭션이 동일한 데이터를 두 번 읽었을 때, 중간에 다른 트랜잭션이 데이터를 수정하여 읽은 결과가 달라지는 문제.
-
팬텀 읽기(Phantom Read): 한 트랜잭션이 데이터 조건에 맞는 항목을 검색한 후, 다른 트랜잭션이 데이터 항목을 삽입 또는 삭제하여 결과가 달라지는 문제.
병행 제어의 구현 사례
MySQL의 InnoDB
-
InnoDB 스토리지 엔진은 MVCC를 사용하여 병행 제어를 관리합니다.
-
잠금 정책: 자동 잠금 및 명시적 잠금을 모두 지원.
-
격리 수준(Isolation Level): Read Uncommitted, Read Committed, Repeatable Read, Serializable.
PostgreSQL
-
PostgreSQL 역시 MVCC를 기반으로 병행 제어를 수행.
-
트랜잭션 격리 수준과 고급 잠금 메커니즘을 제공.
Oracle
-
Oracle은 다양한 잠금 메커니즘과 타임스탬프 기반 병행 제어를 제공하여 고성능 트랜잭션 처리를 지원.
결론
병행 제어는 데이터베이스 시스템의 안정성과 신뢰성을 보장하는 핵심 메커니즘입니다. 로킹, 낙관적 제어, MVCC 등 다양한 기법이 사용되며, 각 기법은 환경에 따라 적합성이 다릅니다. 따라서 시스템의 요구 사항에 맞는 병행 제어 방법을 선택하고 올바르게 구현하는 것이 중요합니다.
병행 제어는 단순히 성능 문제를 해결하는 것을 넘어 데이터 무결성과 안정성을 보장하는 데이터베이스 설계의 핵심 요소입니다.