락킹이란?
락킹(Locking)은 여러 프로세스나 스레드가 동시에 데이터베이스나 파일 시스템의 동일한 데이터에 접근하는 상황에서 데이터의 일관성과 무결성을 유지하기 위한 동시성 제어 기법입니다.
락킹의 기본 개념
•
락(Lock): 데이터에 대한 접근을 제어하기 위해 사용되는 메커니즘으로, 데이터를 사용하고 있는 트랜잭션 혹은 스레드가 락을 걸어 다른 트랜잭션의 접근을 막습니다.
•
락 관리자(Lock Manager): 락을 요청, 부여, 반환하는 등의 락 관련 작업을 총괄하는 시스템 컴포넌트입니다.
•
락 유형(Lock Types): 공유 락(Shared Lock)과 배타 락(Exclusive Lock) 두 가지 주요 유형이 있습니다. 공유 락은 데이터를 읽을 때 사용하고, 배타 락은 데이터를 쓸 때 사용합니다.
공유 락은 여러 트랜잭션이 동시에 같은 데이터를 읽을 수 있지만, 배타 락은 단 하나의 트랜잭션만이 데이터를 쓸 수 있도록 합니다.
락킹의 주요 목적
•
데이터 무결성(Data Integrity): 락킹은 동시에 여러 트랜잭션이 같은 데이터를 변경하지 못하게 하여 데이터 무결성을 보장합니다.
•
일관성 유지(Consistency Maintenance): 트랜잭션이나 스레드 간의 데이터 일관성을 유지하도록 도와줍니다.
락킹 전략
•
비관적 락킹 (Pessimistic Locking)
비관적 락킹은 이름에서 알 수 있듯이, 트랜잭션 간의 충돌이 빈번하게 발생할 것이라고 '비관적'으로 가정합니다. 따라서 다음과 같은 특징을 가지고 있습니다.
◦
트랜잭션이 데이터에 접근하려 할 때, 그 데이터는 바로 락(잠금)을 걸어 다른 트랜잭션이 접근하지 못하게 합니다. 이는 데이터가 변경되거나 읽혀질 때 발생합니다.
◦
데이터의 일관성과 무결성을 보장하기 위해 사용됩니다.
◦
락이 걸린 데이터는 트랜잭션이 완료될 때까지(커밋이나 롤백이 될 때까지) 다른 트랜잭션에서 사용할 수 없습니다.
◦
리소스가 충분하지 않거나 대기 시간이 길어질 수 있어 성능 저하가 일어날 수 있습니다.
◦
교착 상태(Deadlock)가 발생할 가능성이 있으며, 이를 관리하기 위한 추가적인 로직이 필요합니다.
•
낙관적 락킹 (Optimistic Locking)
낙관적 락킹은 충돌이 그리 자주 발생하지 않을 것이라고 '낙관적'으로 가정합니다. 이 방법은 다음과 같은 특징을 가집니다.
◦
트랜잭션 시작 시 데이터에 바로 락을 걸지 않습니다.
◦
데이터를 업데이트하거나 커밋할 때까지 실제 변경이 없다고 가정하고 진행합니다.
◦
데이터에 변경이 발생하려 할 때만, 그 시점의 데이터와 트랜잭션이 시작될 때의 데이터를 비교하여 변경 사항이 없는지 확인합니다.
◦
충돌이 감지되면, 트랜잭션은 보통 롤백되고, 재시도하거나 충돌을 해결하는 로직을 수행합니다.
◦
비관적 락킹에 비해 동시성이 높아 성능 이점이 있을 수 있습니다.
◦
충돌의 가능성이 낮은 응용 프로그램에 적합하며, 교착 상태의 위험이 적습니다.
락킹의 문제점
•
데드락(Deadlock): 두 트랜잭션이 서로의 락을 기다리는 상황이 발생하여, 무한 대기 상태에 빠지는 문제입니다.
•
락 경합(Lock Contention): 많은 트랜잭션이 동일한 데이터에 대한 락을 경합할 때 성능 저하가 발생할 수 있습니다.