🚩 소개
소프트웨어 개발에서 동시성 문제는 필수적으로 다뤄야 할 중요한 이슈입니다.
특히, 여러 트랜잭션이 동시에 데이터에 접근할 때 발생할 수 있는 일관성 문제는 시스템의 안정성과 성능에 큰 영향을 미칩니다.
이번 글에서는 동시성 문제의 해결 방법에 대해 정리해보겠습니다.
⭐ 동시성 문제란?
동시성 문제란 여러 트랜잭션이 동시에 실행될 때 발생하는 데이터의 일관성 및 무결성 문제를 말합니다.
트랜잭션이 데이터를 읽거나 수정할 때, 다른 트랜잭션이 동일한 데이터에 접근하지 못하도록 하는 것이 중요합니다.
이를 위해 주로 사용되는 방법이 락(Lock)입니다.
✅ 락의 종류
1️⃣ 공유 락 (Shared Lock)
데이터의 읽기 작업을 허용하지만, 쓰기 작업은 차단합니다.
여러 트랜잭션이 동시에 데이터를 읽을 수 있지만, 데이터 수정은 불가능합니다.
2️⃣ 배타 락 (Exclusive Lock)
데이터의 읽기 및 수정 작업을 독점적으로 허용합니다.
이 락이 걸린 데이터는 다른 트랜잭션이 접근할 수 없습니다.
⭐ 락의 단점
락을 사용하는 동안 다른 트랜잭션은 해당 자원에 접근할 수 없으므로 성능 저하가 발생할 수 있습니다.
특히, 트랜잭션 간의 충돌이 발생할 경우 데드락(Deadlock) 문제가 발생할 수 있습니다.
데드락(Deadlock)은 두 개 이상의 트랜잭션이 서로의 자원을 기다리며 영원히 진행되지 못하는 상태를 의미합니다. 예를 들어, 트랜잭션 A가 자원 X에 대한 락을 가지고 있고, 자원 Y에 대한 락을 요청하는 동안 트랜잭션 B가 자원 Y에 대한 락을 가지고 자원 X를 요청하는 상황이 발생하면, 둘 다 기다리게 되어 진행이 멈춥니다. 이러한 상황은 시스템의 성능을 저하시킬 수 있으므로, 이를 예방하거나 해결하는 방법이 필요합니다.
⭐ 락을 대체하는 방법
동시성 문제를 해결하기 위해 여러 가지 대체 방법이 있습니다.
1️⃣ MVCC (다중 버전 동시성 제어)
데이터의 여러 버전을 유지하여 트랜잭션이 시작 시점의 데이터 스냅샷을 사용하도록 합니다.
이를 통해 트랜잭션 간의 충돌을 방지하며, 성능을 향상시킬 수 있습니다.
MVCC는 락을 사용하지 않기 때문에 대기나 데드락 문제를 피할 수 있습니다.
2️⃣ 낙관적 동시성 제어 (Optimistic Concurrency Control)
트랜잭션이 수행되는 동안 데이터에 대한 락을 사용하지 않고, 최종적으로 데이터 변경 시점에 충돌이 발생하지 않았는지 확인합니다.
충돌이 발생하면 트랜잭션을 롤백하고 다시 시도합니다. 이 방법은 읽기 작업이 많은 환경에서 효과적입니다.
3️⃣ 트랜잭션 격리 수준
트랜잭션의 격리 수준을 설정하여 동시성 문제를 조절합니다.
예를 들어, READ COMMITTED, SERIALIZABLE 등 다양한 격리 수준이 있으며, 각 수준에 따라 트랜잭션 간의 상호작용이 달라집니다.
4️⃣ 비관계형 데이터베이스
비관계형 데이터베이스는 락을 사용하지 않는 구조로 설계되어 있으며, 대량의 동시성을 처리하는 데 유리합니다.
특히, NoSQL 데이터베이스는 높은 성능과 확장성을 제공하며, 다양한 접근 방법을 지원합니다.
🚩 결론
동시성 문제 해결을 위한 다양한 접근 방법은 각기 장단점이 있습니다.
시스템의 요구 사항과 사용 사례에 따라 적절한 방법을 선택하여 사용하는 것이 중요합니다.
MVCC와 같은 현대적인 기법들은 성능을 높이고 데드락 문제를 피하는 데 효과적이며, 낙관적 동시성 제어는 읽기 중심의 트랜잭션에 적합합니다.
결국, 동시성 문제를 해결하기 위한 적절한 전략 선택이 시스템의 안정성과 효율성을 높이는 데 큰 도움이 됩니다.
'기술 지식 쌓아가기 📚 > Backend 🍔' 카테고리의 다른 글
[시스템 아키텍처] Observability Support: 시스템 모니터링의 새로운 패러다임 (0) | 2024.10.14 |
---|---|
[DB] ACID 원칙과 정규화: 데이터베이스 설계의 핵심 원칙 (0) | 2024.10.13 |
[시스템 아키텍처] CI/CD 오케스트레이션: Docker, Jenkins, Kubernetes의 조화로운 협력 (0) | 2024.10.13 |
[시스템 아키텍처] 동기 vs 비동기 ➕ 블록 vs 논블록 (1) | 2024.10.09 |
[DB] JPA와 ORM: 데이터베이스와의 스마트한 연결 (0) | 2024.10.08 |