낙관적/비관적 락 : Optimistic/Pessimistic Lock
- Lock이란 : 동시 수정 충돌 대비 전략
-
더보기
- 동시성 제어가 기술적으로 구체화된 담론으로, 동시에 데이터를 수정하는 충돌을 처리하는 방법론을 의미한다.
- DB 레벨에서 트랜잭션/스냅샷을 활용하는 비관적 락과 어플리케이션 레벨의 버전관리로 예외를 던지는 낙관적 락으로 분류된다. 이름은 충돌 빈도에 대한 가정으로 분류된다. 비관적 락은 "아 충돌 자주 발생하겠네" 라는 비관적 가정을, 낙관적 락은 "충돌 별로 없을 것 같은데"라는 낙관적 가정을 담은 이름이다.
- On optimistic methods for concurrency control, 1981, H.Kung, John T. Robinson
- 원문에서도 충돌 빈도로 설명하는 탓인지 어딜 봐도 하나같이 빈도로만 설명하는데, 후술하겠지만 현대적인 실상에 부합하는 가정은 아니다. 충돌 빈도로 따지자면 정 반대에 가깝고, 실상에 부합하게 하려면 충돌 빈도가 아니라 충돌로 발생하는 문제의 위험 수준으로 분류하는 게 맞다.
- 비관적 락 : 문제 생기면 치명적이니까 DB 레벨에서 잠궈버려.
-
더보기
- DB 레벨 트랜잭션/스냅샷을 통해 해당 트랜잭션의 락이 풀릴 때까지 다른 트랜잭션은 이에 접근하지 못한다.
- 데이터 무결성과 정합성이 매우 강하게 보장된다.
- 충돌시 락 대기로 인한 성능 저하, 그리고 교착 상태 등의 문제가 발생할 수 있다.
- 비관적 락의 실현적인 용처는 이름의 유래와 달리 "충돌이 자주 발생할만한" 곳이 아니다. 장단점에서 알 수 있듯, 비관적 락은 성능 이슈를 감안하더라도 무결성과 정합성이 중요한 서비스에 적합한 동시성 제어 전략이다. 따라서 은행권이나 재고관리 시스템 처럼 전역적인 정합성이 크리티컬한 서비스에서 사용된다.
- 충돌이 자주 발생할 것으로 예상되는 서비스가 아니라, 충돌로 인해 발생하는 문제가 치명적인 서비스에서 적합하고 또한 그러한 서비스에서 사용되는 전략이다. 이름과 달리 잦은 충돌이 예상되는 서비스에 비관적 락은 시스템 뻗기 딱 좋다. 비관적 락의 실체는 "느리지만 정확한" 전략인데, 졸라 바쁜 서비스에 이걸 쓰겠다고?
- DB 레벨 트랜잭션/스냅샷을 통해 해당 트랜잭션의 락이 풀릴 때까지 다른 트랜잭션은 이에 접근하지 못한다.
- 낙관적 락 : 재수 없으면 가끔 틀릴 수도 있지 뭐 어플리케이션 레벨 예외로 던져버리기
-
더보기
- 어플리케이션 레벨 버전관리 등을 통해 검증하고 예외를 던져 재시도를 유도한다.
- 충돌시 예외로 던져 트랜잭션을 끌지 않아 일반적으로 성능이 매우 우수하다
- 데이터 무결성과 정합성 문제가 발생할 수 있다. 어플리케이션은 하나의 DB Wrapper로 축약할 수도 있는데, 모든 래핑은 불합치 리스크이기 때문이다.
- "충돌이 잦은 케이스에서 오히려 성능 저하가 크다"를 단점으로 삼는 경우가 많은데, 그 성능 저하의 실체가 비관적 락과는 다르다. 비관적 락에서 성능 저하는 "시스템의 DB 처리 성능 저하"를 크게 염두하는 반면, 낙관적 락에서의 성능 저하는 "사용자의 불편함"에 가깝다. 낙관적 락 채택한다고 DB 처리 성능이 저하될 방도가 없다. DB 경합 부하를 메모리 부하로 넘기는 형국이기 때문에 DB는 오히려 쾌적해진다.
- 낙관적 락의 실현적인 용처는 이름의 유래와 달리 "충돌이 드물게 발생할만한" 곳이 아니다. 무결성/정합성 문제를 감안하더라도 성능이 더 중요한 서비스에 적합한 동시성 제어 전략이다. 따라서 일반적인 공유 시스템이나 커뮤니티 처럼 다소간의 불합치보다 성능이 더 중요한 서비스에서 사용된다.
- 충돌이 드물게 발생할 것으로 예상되는 서비스가 아니라, 충돌로 인해 발생하는 문제가 상대적으로 느슨한 서비스에 적합하고 또한 그런 서비스에서 자주 사용되는 전략이다. 이름과 달리 충돌이 드물 것으로 예상되는 서비스에 낙관적 락은 별 쓸모가 없다. 빠를 필요가 없는 서비스를 위해 약간의 문제를 비용으로 주고 속도를 구매해오는 꼴이다.
- 어플리케이션 레벨 버전관리 등을 통해 검증하고 예외를 던져 재시도를 유도한다.
- 요약
-
더보기
- 비관적 락
- 틀리면 큰일나는데;;;
- 낙관적 락
- 에이 가끔 좀 틀릴 수도 있지 우주선 만드는 것도 아닌데 다들 이해할 거야 한잔해
- 비관적 락
'DEVELOPMENT > COMPUTER SCIENCE' 카테고리의 다른 글
| 비동기성과 동시성, 병렬성(Asynchrony & Concurrency & Parallelism) (0) | 2026.01.30 |
|---|---|
| 프로세스와 스레드(Process & Thread) (0) | 2026.01.30 |
| 프로세스 메모리 레이아웃(Process Memory Layout) (0) | 2026.01.29 |