동시성 제어
데이터베이스의 동시성 제어를 통해 여러 트랜잭션(Transaction)이 서로 간섭하지 않고 동시에 발생할 수 있습니다.
동시 실행에도 불구하고 트랜잭션의 일관성, 격리 및 내구성을 보장하게 하는 것이죠!
데이터베이스의 동시성 문제에 대한 일반적인 패턴
공유 리소스 조회
여러 트랜잭션이 공유 리소스를 읽고 있을 때 하나의 트랜잭션이 리소스를 수정하는 경우 제대로 관리하지 않으면 불일치가 발생할 수 있습니다.
공유 리소스 업데이트
여러 트랜잭션이 공유 리소스를 동시에 업데이트하려고 하면 충돌이 발생할 수 있습니다.
이를 종종 쓰기-쓰기 충돌이라고 합니다.
교착 상태
교착 상태는 두 개 이상의 트랜잭션이 서로 리소스를 해제하기를 무한정 기다릴 때 발생합니다.
이는 관리해야 하는 동시성 제어의 일반적인 문제입니다.
업데이트 손실
둘 이상의 트랜잭션이 동일한 행을 선택한 다음 원래 선택한 값을 기준으로 행을 업데이트하는 경우에 발생합니다.
마지막 업데이트는 첫 번째 업데이트로 인해 두 번째 업데이트로 인해 다른 결과가 계산되었음에도 불구하고 첫 번째 업데이트를 덮어씁니다.
동시성 문제가 어려운 이유
일단 동시성 문제는 논리 문제가 아니므로 테스트 환경과 같은 단일 테스트 중에는 감지하기 어렵습니다.
추적하기 어려울 수 있는 여러 프로세스 또는 스레드의 상호 작용을 포함하기 때문에 코드에서 확인하기 어렵습니다.
게다가 동시성 문제는 단일 코드 조각이 아니라 여러 코드 조각의 상호 작용으로 인해 발생하기 때문에 코드 검토 중에 발견하기 어렵습니다.
또한, 항상 발생하지는 않지만 비결정적으로 발생하므로 재현 및 진단이 어렵습니다.
동시성 제어의 특징
Atomicity
동시성 제어는 트랜잭션이 분리할 수 없는 단일 작업 단위로 처리되도록 합니다.
격리
트랜잭션의 중간 상태가 다른 트랜잭션에 보이지 않도록 합니다.
일관성
트랜잭션이 데이터베이스를 하나의 유효한 상태에서 다른 상태로 가져오도록 보장합니다.
교착 상태 처리
동시 제어 메커니즘에는 교착 상태를 방지하거나 처리하는 방법이 포함됩니다.
잠금
동시성 제어의 일반적인 방법 중 하나는 트랜잭션이 사용 중인 리소스를 잠그어 트랜잭션이 완료될 때까지 다른 트랜잭션이 리소스에 액세스하지 못하도록 하는 것입니다.
부족한 점이나 잘못 된 점을 알려주시면 시정하겠습니다 :>
'DEV > Backend' 카테고리의 다른 글
Write Lock과 Read Lock (0) | 2023.06.10 |
---|---|
낙관적 Lock과 비관적 Lock (1) | 2023.06.10 |
트랜잭션 격리레벨 (0) | 2023.06.10 |
트랜잭션(Transaction) (0) | 2023.06.10 |
Fan Out On Read (Pull Model) (0) | 2023.06.09 |