![]()
동시성 제어의 필요성

현대의 데이터베이스 시스템에서는 여러 사용자가 동시에 데이터에 접근하고, 수정할 수 있는 환경이 빈번하게 발생합니다. 이러한 상황에서 한 트랜잭션이 데이터를 수정하는 동안 다른 트랜잭션이 해당 데이터를 읽거나 수정할 경우, 데이터의 일관성이 깨질 수 있습니다.
따라서, 동시성 제어는 필수적입니다. 아래의 표는 동시성 제어가 필요한 이유를 정리한 것입니다.| 이유 | 설명 |
|---|---|
| 데이터 무결성 유지 | 여러 사용자가 동시에 데이터를 수정할 때 데이터 오류를 방지함 |
| 트랜잭션 충돌 방지 | 동시에 실행되는 트랜잭션 간의 충돌을 예방함 |
| 시스템 성능 향상 | 여러 트랜잭션을 동시에 처리하여 성능을 최적화함 |
| 사용자 경험 향상 | 동시 실행을 통해 더 빠른 응답 시간 제공 |
동시성 제어는 데이터베이스의 성능을 높이고, 사용자 경험을 향상시키는 데 중요한 역할을 합니다. 이제 동시성 제어에서 발생할 수 있는 문제와 그 해결책에 대해 살펴보겠습니다.
동시성 제어에서 발생할 수 있는 문제

동시성 제어의 주요 문제 중 하나는 갱신 손실(Lost Update)입니다. 이는 두 개의 트랜잭션이 동일한 데이터를 동시에 수정하려 할 때 발생하는 문제입니다.
예를 들어, 트랜잭션 A가 데이터 X를 수정하고 있는 동안, 트랜잭션 B도 동일한 데이터 X를 수정하려고 한다면, 트랜잭션 A의 수정이 트랜잭션 B에 의해 덮어쓰여질 수 있습니다. 이러한 상황은 데이터의 일관성을 해칠 수 있습니다.갱신 손실 문제 외에도 데드락(Deadlock)이라는 또 다른 문제가 발생할 수 있습니다. 데드락은 두 개 이상의 트랜잭션이 서로 상대방의 자원을 기다리며 무한 대기 상태에 빠지는 경우를 말합니다.예를 들어, 트랜잭션 A가 자원 1에 대해 락을 걸고 자원 2에 대한 락을 요청하는 동안, 트랜잭션 B가 자원 2에 대해 락을 걸고 자원 1에 대한 락을 요청하는 상황입니다. 이런 경우 두 트랜잭션은 서로를 기다리게 되어, 시스템이 정지 상태에 빠지게 됩니다.아래 표는 동시성 제어에서 발생할 수 있는 주요 문제들을 정리한 것입니다.| 문제 유형 | 설명 |
|---|---|
| 갱신 손실 | 두 개의 트랜잭션이 동일한 데이터를 동시에 수정하는 경우 |
| 데드락 | 두 트랜잭션이 서로 상대방의 자원을 기다리며 정지하는 경우 |
| 비일관성 | 트랜잭션이 완전하게 수행되지 않아 데이터의 일관성이 깨지는 경우 |
| 비가시성 | 한 트랜잭션의 수정 사항이 다른 트랜잭션에서 보이지 않는 경우 |
이러한 문제들은 데이터베이스의 일관성을 해치고, 결국 비즈니스에 부정적인 영향을 미칠 수 있습니다. 따라서 이를 해결하기 위한 방법이 필요합니다.
동시성 제어의 해결책

동시성 제어 문제를 해결하기 위해 다양한 방법이 존재합니다. 그중 가장 일반적인 방법은 락(Lock) 메커니즘을 사용하는 것입니다.
락은 특정 데이터에 대한 접근을 제한하여, 하나의 트랜잭션이 데이터를 수정하는 동안 다른 트랜잭션이 해당 데이터에 접근하지 못하도록 합니다. 이로 인해 갱신 손실을 방지할 수 있습니다.락의 종류에는 크게 두 가지가 있습니다. 첫 번째는 공유 락(Shared Lock)으로, 여러 트랜잭션이 동시에 데이터를 읽을 수 있도록 허용하지만, 데이터를 수정하는 것은 허용하지 않습니다.두 번째는 배타 락(Exclusive Lock)으로, 해당 데이터를 수정하는 트랜잭션만 접근할 수 있도록 제한합니다. 이러한 락을 적절히 사용함으로써 동시성 제어 문제를 해결할 수 있습니다.아래 표는 락의 종류와 그 특징을 정리한 것입니다.| 락 종류 | 설명 | 사용 용도 |
|---|---|---|
| 공유 락 | 여러 트랜잭션이 동시에 데이터를 읽을 수 있도록 허용 | 데이터 읽기 시 사용 |
| 배타 락 | 한 트랜잭션만 해당 데이터를 수정할 수 있도록 제한 | 데이터 수정 시 사용 |
그러나 락을 사용할 때 주의해야 할 점은 데드락의 가능성이 있다는 것입니다. 데드락을 방지하기 위해서는 트랜잭션이 락을 요청하는 순서를 정해두거나, 주기적으로 락을 해제하는 방법 등이 있습니다.
데드락이 발생하면, 일반적으로 작업 중인 트랜잭션 중 하나를 강제 종료하고, 나머지 트랜잭션이 정상적으로 실행될 수 있도록 합니다. 이때, 강제 종료된 트랜잭션의 변경 사항은 롤백(Rollback) 처리하여 원래 상태로 되돌립니다.스케줄과 충돌
동시성 제어를 이해하기 위해서는 스케줄(Schedule)과 충돌(Conflict) 개념도 중요합니다. 스케줄은 여러 트랜잭션이 실행될 때 각 트랜잭션의 작업들이 실행되는 순서를 의미합니다.
트랜잭션이 실행될 때의 각 작업은 읽기(Read)와 쓰기(Write)로 나눌 수 있습니다. 스케줄 간의 충돌은 두 작업이 서로 영향을 주는지를 나타냅니다.두 작업이 서로 다른 트랜잭션에서 실행되면서 하나의 데이터에 대해 동시에 읽기와 쓰기를 시도할 경우 충돌이 발생하게 됩니다. 이러한 충돌은 데이터의 결과에 영향을 미치며, 데이터베이스의 일관성을 해칠 수 있습니다.아래 표는 스케줄과 충돌 개념을 정리한 것입니다.| 개념 | 설명 |
|---|---|
| 스케줄 | 여러 트랜잭션의 작업이 실행되는 순서 |
| 충돌 | 두 작업이 서로 영향을 미쳐 결과가 달라지는 경우 |
| 충돌 동등성 | 두 스케줄이 동일한 결과를 생성하는 경우 |
| 충돌 직렬화 가능성 | 비직렬 스케줄이 직렬 스케줄과 동일한 결과를 생성할 수 있는지 여부 |
충돌 동등성을 만족하는 스케줄은 충돌 직렬화 가능성(Conflict Serializable)이라고 합니다. 이는 여러 트랜잭션이 비직렬적으로 실행되더라도, 결과적으로 직렬 스케줄과 동일한 결과를 얻을 수 있다는 것을 의미합니다.
이러한 스케줄을 통해 성능을 높이면서도 데이터의 일관성을 유지할 수 있습니다.결론
동시성 제어는 데이터베이스의 일관성과 무결성을 유지하기 위한 필수적인 기술입니다. 갱신 손실, 데드락 등의 문제를 피하기 위해 락을 적절히 사용하고, 스케줄의 충돌을 관리하는 것이 필요합니다.
동시성 제어를 통해 여러 트랜잭션을 동시에 처리할 수 있으며, 이러한 과정을 통해 데이터베이스의 성능을 최적화할 수 있습니다. 동시성 제어의 기초 원리를 알아보고, 이를 통해 발생할 수 있는 문제와 해결 방법을 숙지하는 것이 데이터베이스 관리에 있어 매우 중요합니다.향후에는 이론적인 부분뿐만 아니라 실제 데이터베이스 시스템에서의 동시성 제어 적용 사례를 살펴보는 것도 유익할 것입니다.