1️⃣ 비관적 락
-
먼저 락을 걸고 다른 트랜잭션의 접근을 차단하는 방식이다.
-
충돌을 완전히 방지할 수 있지만, 대기 시간이 길어지고 동시성이 낮아지는 단점이 있다.
-
은행 계좌 이체나 좌석 예약과 같은 충돌이 치명적인 경우에 사용한다.
2️⃣ 낙관적 락
-
트랜잭션이 끝날 때 데이터가 변경되지 않았는지 검증하는 방식이다.
-
충돌이 적을 경우 성능이 좋지만, 충돌이 발생하면 재시도가 필요하다.
-
낙관적 락(Optimistic Lock)을 사용하면 트랜잭션이 데이터에 대한 접근을 차단하지 않고,
최대한 여러 사용자가 동시에 데이터를 읽고 수정할 수 있도록 허용하는 방식이다.
-
대량 데이터를 처리할 때 낙관적 락을 선택하면, 트랜잭션을 차단하지 않고 동시 접근성을 높일 수 있다.
-
즉, 여러 사용자가 동시에 데이터를 읽고 수정할 수 있으며, 데이터 충돌이 발생하면 갱신 시점에서 해결하는 방식이다.
비관적락과 낙관적락 한 줄 비교
관적 락은 데이터 변경을 시도하는 동안 다른 트랜잭션의 접근을 차단하지만,낙관적 락은 차단하지 않고 충돌이 발생했을 경우에만 처리하는 방식이다.
3️⃣ 분산 락
- 여러 서버에서 같은 자원에 접근할 때 충돌을 방지하는 방식이다.
- 주로 Redis 등을 활용하여 구현하며, 마이크로서비스 환경에서 특정 리소스에 대한 동시 접근을 제어할 때 사용된다.
Redis를 활용한 분산 락 (Distributed Lock)
- 마이크로서비스 환경에서는 여러 노드(서버)에서 동일한 리소스에 접근할 때 동시성을 제어하는 것이 중요하다.
- 이때 Redis와 같은 분산 시스템을 활용하여 "분산 락(Distributed Lock)"을 구현할 수 있다.
- 이렇게 하면 다중 노드 환경에서도 특정 리소스에 대한 동시 접근을 안전하게 제어할 수 있다.
1. 왜 Redis를 사용하는가?
분산 환경에서 발생하는 문제점
- 여러 서비스 인스턴스(마이크로서비스)가 동시에 동일한 데이터에 접근하면 데이터 충돌이 발생할 수 있다.
- 하나의 서버에서만 락을 관리하면 다른 서버에서 이를 인식하지 못한다. → 따라서 중앙 집중형 락 시스템이 필요하다.
Redis의 역할

2. Redis를 활용한 분산 락 (RedLock)
1) RedLock 개념
- Redis는 단일 노드에서 락을 설정할 수 있지만, 여러 노드에서 락을 관리하는 RedLock 알고리즘을 사용하면 고가용성을 보장할 수 있다.
2) RedLock을 사용하는 방식
-
SETNX (Set if Not Exists) 명령어를 활용하여 락을 설정
- 한 번에 하나의 서비스만 특정 키를 설정할 수 있도록 보장
-
TTL(Time-To-Live, 만료 시간) 설정
- 특정 시간이 지나면 자동으로 락 해제 (예: 10초)
-
락을 해제할 때 동일한 프로세스만 해제 가능하도록 보장
-
분산 환경에서는 여러 Redis 노드에서 락을 획득하여 신뢰성을 향상