락(locking) 메커니즘
- 트랜잭션 락 매커니즘은 데이터베이스에서 여러 트랜잭션이 동시에 데이터에 접근할 때의 문제를 해결하기 위한 핵심 메커니즘입니다.
- 필요성
- 다중 트랜잭션이 동시에 데이터를 조작할 때 데이터 일관성을 유지하려면 효과적인 락 매커니즘이 필요합니다.
- 다중 사용자 환경에서 발생할 수 있는 동시성 문제를 해결하고 데이터의 무결성을 유지
- 데드락 방지: 트랜잭션 간에 순환적인 락 획득에 의한 데드락을 방지하기 위한 메커니즘으로 사용됩니다.
데드락(=교착 상태)
- 멀티스레드 또는 멀티프로세스 환경에서 두 개 이상의 프로세스나 스레드가 서로 상대방의 작업이 끝나기를 기다리며 무한히 대기하는 상태
- 시스템적으로 한정된 자원을 여러 곳에서 사용하려고 할 때 발생
- 데드락의 필요조건(필요조건들이 모두 충족시 데드락 발생)
- 상호 배제(Mutual Exclusion)하나의 자원은 한 번에 하나의 프로세스 또는 스레드에 의해서만 사용될 수 있어야 합니다.
- 점유 대기(Hold and Wait): 프로세스가 적어도 하나의 자원을 소유한 채로 다른 자원을 얻기 위해 대기하는 상태입니다.
- 비선점(No Preemption): 다른 프로세스에 할당된 자원을 강제로 빼앗아 사용할 수 없어야 합니다.
- 순환 대기(Circular Wait): 프로세스 집합에서 각 프로세스는 다음 프로세스가 소유한 자원을 대기하며, 마지막 프로세스는 첫 번째 프로세스가 소유한 자원을 대기하는 상태입니다.
- 데드락은 시스템의 성능을 저하시키고, 프로세스들이 작업을 완료하지 못하게 만들어 시스템을 불안정하게 만들 수 있기 때문에 관리해야 합니다.
데드락을 다루기 위한 두 가지 전략
데드락 예방 (Deadlock Prevention)
- 데드락 예방은 데드락 발생의 필요조건을 깨뜨려 데드락을 사전에 방지하는 전략입니다.
- 필요조건 중 하나 이상을 충족하지 않도록런타임 시스템의 상태를 고려한 설계되어야 합니다.
- 이미 앞서 언급한 상호 배제, 점유 대기, 비선점, 순환 대기 조건 중 하나 이상을 방지합니다.
- 데드락 예방은 시스템이 안정적으로 동작하도록 제한을 두는 것입니다.
- 상호 배제 조건 깨뜨리기
- 자원에 대한 상호 배제 조건을 완화하거나 없애면서 여러 프로세스가 동시에 자원을 공유할 수 있도록 합니다.
- 이 방법은 쉽게 적용되지 않을 수 있으며, 특정 상황에서만 가능한 경우가 있습니다.
- 점유 대기 조건 깨뜨리기
- 프로세스가 필요한 모든 자원을 미리 한꺼번에 요청하도록 변경하여 점유 대기 조건을 방지할 수 있습니다.
- 프로세스가 필요한 모든 자원을 요청할 때까지 어떠한 자원도 할당되지 않도록 하는 방법도 있습니다.
- 비선점 조건 깨뜨리기
- 자원을 강제로 빼앗아 사용할 수 있도록 하는 방법을 선택합니다.
- 이는 다른 프로세스의 자원을 선점하는 것이므로 신중하게 적용해야 합니다.
- 순환 대기 조건 깨뜨리기
- 자원에 고유한 번호를 할당하고, 프로세스는 번호순으로 자원을 요청하도록 하는 방법을 통해 순환 대기를 방지할 수 있습니다.
- 자원에 대한 순서를 정의하여 순환 대기를 방지할 수 있습니다.
- 상호 배제 조건 깨뜨리기
데드락 회피 (Deadlock Avoidance)
- 데드락 회피는 시스템이 런타임 중에 데드락이 발생하지 않도록 하는 전략입니다.
- 런타임 동안의 자원 할당 상태를 감시하여 조치
- 이는 각 프로세스가 자원을 요청할 때 시스템이 자원 할당을 허용할지 말지를 사전에 결정합니다.
- 안전한 상태를 유지하며 자원을 할당하여 데드락을 회피합니다.
- 타임아웃 및 자원 반납
- 특정 시간 내에 자원을 할당받지 못한 프로세스는 자원을 반납하고, 나중에 다시 시도하도록 하는 방법입니다.
- 일정 시간 이내에 자원을 얻지 못하면 프로세스는 자원을 반납하고 다시 시작하여 데드락을 피할 수 있습니다.
예시:
- 은행원 알고리즘이라 불리는 방법으로, 프로세스가 자원을 요청할 때 시스템이 안전한 상태로 유지되는지 미리 확인하고, 안전하면 자원을 할당하고 그렇지 않으면 기다리게 하는 방법
- 데드락 예방과 회피는 데드락을 방지하는 두 가지 접근 방식이지만, 예방은 데드락의 필요조건을 제거하고, 회피는 데드락이 발생할 가능성을 런타임에 평가하여 안전한 상태를 유지합니다.
데드락 예방은 런타임 시스템의 상태를 고려한 설계를 요구하며, 데드락 회피는 런타임 동안의 자원 할당 상태를 감시하여 조치를 취하는 방식입니다.
락 획득(Lock Acquisition)
- 락 획득은 트랜잭션이나 스레드가 데이터에 접근하기 전에 해당 데이터에 대한 락을 획득하는 과정입니다.
- 이는 데이터의 동시 접근을 조절하여 데이터 일관성을 유지하고 충돌을 방지하기 위한 중요한 단계입니다.
트랜잭션이 데이터에 접근하기 전에 락을 획득
- 트랜잭션이 데이터를 읽거나 수정하기 전에 해당 데이터에 대한 락을 획득합니다.
- 이로써 여러 트랜잭션이 동시에 같은 데이터를 수정하거나 읽는 충돌을 방지할 수 있습니다.
공유 락과 배타 락은 각각 다른 트랜잭션에서 동시에 획득 가능
- 공유 락(Shared Lock)
- 여러 트랜잭션이 동시에 읽기 연산을 수행할 수 있게 함
- 여러 트랜잭션이 동시에 데이터를 읽을 수 있지만, 쓰기 작업을 하려는 경우에는 다른 트랜잭션들과 충돌을 방지하기 위해 락을 걸어서 데이터의 일관성을 보장합니다.
- 즉, 여러 트랜잭션이 동시에 읽을 수 있지만, 쓰기 작업은 한 번에 하나의 트랜잭션만 수행할 수 있습니다.
- 배타적 락(Exclusive Lock 또는 Write Lock)
- 트랜잭션이 데이터를 쓰기 위해서는 배타적 락을 획득합니다.
- 이 락을 획득한 트랜잭션이 해당 데이터에 대한 쓰기 작업을 수행하는 동안 다른 트랜잭션은 해당 데이터에 대한 어떠한 락도 획득할 수 없습니다.
- 각각의 락은 서로 다른 트랜잭션에서 동시에 획득될 수 있으며, 이는 읽기와 쓰기의 충돌을 효과적으로 관리할 수 있도록 합니다.
락 해제(Lock Release)
- 락 해제는 트랜잭션이나 스레드가 데이터 조작이나 작업을 완료한 후에 해당 데이터에 대한 락을 해제하는 과정을 나타냅니다.
트랜잭션이 작업을 완료하면 락을 해제
- 트랜잭션이 데이터 조작이나 작업을 완료하면 해당 데이터에 대한 락을 해제합니다.
- 락 해제는 다른 트랜잭션이나 스레드가 해당 데이터에 접근할 수 있도록 허용하는 역할을 합니다.
다른 트랜잭션이 해당 데이터에 접근할 수 있게 됨
- 락 해제된 데이터는 다른 트랜잭션이나 스레드에 의해 접근 가능해집니다.
- 이로써 다른 작업들이 계속해서 데이터에 접근하여 작업을 수행할 수 있습니다.
락의 충돌
- 락이 충돌하는 주요 이유는 다수의 트랜잭션이나 스레드가 공유 데이터에 접근하려고 할 때 발생
- 동시에 여러 트랜잭션이 동일한 데이터를 수정하거나 읽으려고 시도할 때 발생
충돌 원인
- 경쟁 조건(Race Condition)
- 여러 트랜잭션이 동시에 공유 데이터를 읽거나 수정하려고 할 때, 그들 사이에 경쟁 조건이 발생할 수 있습니다.
- 동시에 여러 트랜잭션이 데이터를 변경하면서 상호 간의 충돌이 발생하게 됩니다.
- 락의 부재 또는 부적절한 사용
- 락이 충돌하는 또 다른 이유는 락의 부재나 부적절한 사용입니다.
- 특히, 트랜잭션이 데이터에 접근할 때 적절한 락을 획득하지 않거나, 락을 부적절한 순서로 획득하거나 해제할 때 충돌이 발생할 수 있습니다.
- 데이터 일관성 유지를 위한 락 사용
- 락은 데이터베이스나 다중 프로세스 환경에서 데이터 일관성을 유지하기 위해 사용됩니다.
- 따라서 여러 트랜잭션이 데이터를 변경하려 할 때 락이 부적절하게 설정되면 충돌이 발생할 수 있습니다.
- 데이터 읽기 및 쓰기 작업의 순서
- 서로 다른 트랜잭션이 데이터를 읽고 쓰는 작업을 동시에 수행할 때, 그 작업들의 순서에 따라 충돌이 발생할 수 있습니다.
- 일관성을 유지하기 위해 특정한 순서로 데이터에 접근해야 하는 경우, 이를 지키지 않으면 충돌이 발생할 수 있습니다.
- 데이터베이스 시스템의 제어 부재
- 일부 데이터베이스 시스템은 충돌을 방지하기 위한 락 관리 기능이 충분하지 않거나 부재할 수 있습니다.
- 데이터베이스 시스템이 충돌을 효과적으로 관리하지 못하면 충돌이 발생할 가능성이 높아집니다.
Lock의 충돌 해결방법
- 락 충돌이 발생할 경우, 데이터베이스 시스템은 충돌을 해결하기 위해 다양한 전략을 활용
- 전략
- 대기(Waiting)
- 충돌이 발생하면 트랜잭션은 일시적으로 대기 상태에 들어갑니다.
- 다른 트랜잭션이 해당 데이터의 락을 해제할 때까지 기다립니다.
- 이는 충돌을 해결하고 데이터 일관성을 유지하는데 도움을 줍니다.
- 우선순위 부여(Priority Assignment)
- 트랜잭션에 우선순위를 부여하여 충돌을 해결하는 전략입니다.
- 특정 조건에 따라 트랜잭션에 우선순위를 할당하고, 높은 우선순위를 갖는 트랜잭션이 충돌 시 다른 트랜잭션보다 먼저 락을 획득할 수 있습니다.
- 타임아웃 설정(Timeouts)
- 트랜잭션이 일정 시간 동안 락을 획득하지 못하면 타임아웃이 발생하고 해당 트랜잭션은 락을 반납하고 다시 시도하도록 합니다.
- 이는 트랜잭션이 무한정 기다리는 것을 방지하며, 데드락을 효과적으로 예방합니다.
- 데드락 탐지 및 해제(Detection and Resolution)
- 데드락이 발생할 경우, 시스템은 데드락을 탐지하고 해결하는 전략을 사용합니다.
- 주기적인 데드락 탐지를 수행하거나 특정 알고리즘을 통해 데드락이 발생하면 해당 상황을 해결하고 트랜잭션을 중단시킵니다.
- 트랜잭션 순서 조정(Transaction Ordering)
- 특정한 순서로 트랜잭션을 실행하여 충돌을 피하거나 최소화하는 전략입니다.
- 트랜잭션 간의 충돌이 예측 가능한 순서로 일어나도록 하는 것이 도움이 됩니다.
- 대기(Waiting)
Lock의 범위와 유지 시간
Lock의 범위
- 트랜잭션은 전체 테이블이나 특정 행에 대한 락을 설정할 수 있습니다.
- 락의 범위는 트랜잭션이 필요한 데이터의 크기에 따라 결정됩니다.
- 큰 범위의 락은 데이터 일관성을 보장하나 동시성을 감소시킬 수 있고, 작은 범위의 락은 동시성을 향상시키나 데이터 일관성에 영향을 줄 수 있습니다.
Lock의 유지 시간
- 락을 얼마 동안 유지할지를 결정하는 것이 중요합니다.
- 유지 시간이 너무 길면 동시성이 감소할 수 있으므로, 적절한 설정이 필요합니다.
- 트랜잭션이 데이터에 대한 작업을 완료하면 락을 해제하여 다른 트랜잭션이 접근할 수 있게 하는 것이 중요합니다.
결과
- 락 메커니즘에 대한 이해를 통해 해당 트랜잭션을 조심스럽게 관리하며 사용해야 함을 깨달았습니다.
- 뿐만 아니라, 상황에 따라 적절한 락, 공유 락과 배타 락을 선택하여 사용하는 방법을 이해했습니다.
느낀점
- 전문 DBA을 지원하지는 않지만 트랜잭션을 이해하기 위해 글을 작성하였습니다. 이로써 트랜잭션의 락 매커니즘에 대해 파악할수 있었으며 사용시 주의점을 알수 있었습니다.
- 또한, 이 내용을 알기에 추후 DBA와 원활한 커뮤니케이션이 될것 같습니다.
참고
'데이터베이스' 카테고리의 다른 글
ACID 원칙과 트랜잭션 관리 방법 (0) | 2024.03.09 |
---|---|
RDBMS와 No-SQL의 차이 (0) | 2022.12.05 |
Redis 설치 및 GUI 적용 (0) | 2022.11.14 |