-
낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)DB 2024. 11. 14. 20:51
1. 낙관적 락(OPtimistic Lock)
낙관적 락은 충돌이 잘 발생하지 않는다고 가정하고 자원을 제어하는 방식이다. 자원을 사용하는 동안 락을 거는 대신, 작업을 끝내기 직전에 충돌이 발생했는지 검사한다. 낙관적 락은 다음과 같은 과정으로 동작한다.
- 자원을 사용할 때 락을 걸지 않고, 다른 프로세스도 동시에 접근할 수 있도록 허용한다.
- 자원 사용이 완료되면, 그 동안 자원이 변경되지 않았는지 확인한다.
- 만약 다른 프로세스가 자원을 변경한 것이 확인되면, 작업을 취소하고 다시 시도한다.
이 방식은 자원을 사용하는 동안 락이 걸리지 않기 때문에 성능이 높으며, 충돌이 거의 발생하지 않는 환경에서 효과적이다. 하지만 충돌이 빈번하다면 작업을 반복해야 할 수 있어 비효율적이다.
2. 비관적 락 (Pessimistic Lcok)
비관적 락은 충돌이 발생할 가능성이 높다고 가정하여 자원에 접근하기 전에 락을 거는 방식이다. 락을 건 프로세스가 작업을 완료하기 전까지 다른 프로세스는 자원에 접근할 수 없다. 비관적 락의 동작 과정은 다음과 같다.
- 자원에 접근할 때 락을 걸고, 다른 프로세스가 접근하지 못하도록 막는다.
- 자원 사용이 끝난 후 락을 해제하여 다른 프로세스가 자원에 접근할 수 있도록 한다.
비관적 락은 충돌이 빈번하게 발생하는 환경에서 유리하며, 충돌이 발생할 가능성이 낮아도 확실하게 자원을 보호할 수 있따. 그러나 항상 락을 거는 동작이 있어 자원 사용에 따라 성능에 부담이 될 수 있따.
- 낙관적 락: 충돌 가능성이 낮은 경우에 유리하며, 충돌이 발생하지 않을 것이라고 가정. 작업 종료시 변경 검증.
- 비관적 락: 충돌 가능성이 높은 경우에 유리하며, 자원을 사용할 때 락을 걸어 안전하게 보호.
이 두 방식은 시스템의 특성에 따라 선택되며, 서로 다른 상황에서 적합하게 사용될 수 있다.
nestjs + typeorm 으로 구현한 간단한 코드를 다음 링크에서 확인 가능https://github.com/O-Seonsik/lock-test/tree/master/src/modules/seller
'DB' 카테고리의 다른 글
DB - 블로킹(Blocking)과 데드 락(Deadlock) (0) 2024.11.11 공유 락(Shared Lock, S-Lock)과 배타 락(Exclusive Lock, X-Lock) (3) 2024.11.10 Isolation level - 트랜잭션 격리 수준 (0) 2024.09.22