인프런 커뮤니티 질문&답변

니나니노님의 프로필 이미지
니나니노

작성한 질문수

재고시스템으로 알아보는 동시성이슈 해결방법

낙관 락 vs 비관 락 실무에서 구체적인 예시를 들어주실 수 있을까요?

작성

·

3.8K

0

  1. 낙관 락과 비관 락을 정확히 언제 사용하는지 궁금한데요, 충돌이 잦을 때는 비관 락을 사용한다고 이해하기엔 막연한 느낌이 있어서요, 혹시 실무에서 구체적인 예시를 들어주실 수 있을까요??

  2. 비관적 락이 구현이 훨씬 간단할 것 같은데, 실제로 실무에서 비관적 락이 아닌 낙관적 락을 직접 구현해서 사용할 일이 있는지도 궁금합니다.

  3. 충돌이 빈번하게 일어난다면 비관적 락이 더 적합할 수 있다고 하셨는데 이유가 뭔가요? 어떤 부분에서 성능상 이점이 있는지 궁금합니다.

     

    자세하게 설명해주시면 정말 감사할 것 같습니다. 감사합니다!!

답변 2

3

최상용님의 프로필 이미지
최상용
지식공유자

니나니노님 안녕하세요.

낙관적락과 비관적락을 사용하는 기준은 "동시에 수정을 하는일이 빈번하게 일어나는가 ?" 입니다.
그렇기때문에 동일한 사례에서도 동시에 수정을 하는일이 적다면 낙관적락을, 동시에 수정하는 상황이 빈번하게 일어난다면 비관적락을 사용한다고 이해하시면 좋을 것 같습니다.
예를들어 1000명의 사용자가 동시에 A 라는 상품을 구매할 때 "충돌이 빈번하게 일어난다" 라고 생각할 수 있을 것 같습니다.
반대로 1000명의 사용자가 A 라는 상품을 구매하지만 구매시간이 각자 다를 때 (예를들어 사용자 1은 1시에, 사용자 2는 1시 1분에 사용자 3은 1시 2분에...) "충돌이 비교적 적게 일어난다" 라고 생각할 수 있을 것 같습니다.

낙관적락의 구현은 JPA 을 사용한다면 크게 어렵지 않게 구현할 수 있기때문에 실무에서도 사용됩니다.


충돌이 빈번하게 일어나는 상황에서 낙관적락을 사용하게 된다면 모든 요청이 완료될때까지 재시도를 수행할 것 입니다.
예를들어 1000 개의 동시수정이 발생한다면 1000 개의 요청이 모두 완료될때까지 재시도를 수행할 것 입니다.
구현마다 다르겠지만 성공할때까지 시도한다고 가정했을 때 데이터베이스에 굉장히 많은 요청을 보내게 될 것입니다.
반면에 비관적락을 사용한다면 lock 을 걸고 수행하기때문에 이후의 요청들은 업데이트가 완료될때까지 기다렸다가 순차적으로 진행하게 됩니다.
이러한 관점에서 봤을 때 충돌가능성이 많다면 비관적락이 더 좋은선택이 될 수 있습니다.

감사합니다!

1

안녕하세요, 인프런 AI 인턴입니다.

낙관 락과 비관 락은 동시성 제어에 있어서 사용되는 방식 중 하나입니다.

비관적 락은 공유 자원을 사용할 때 다른 쓰레드와 충돌이 발생할 가능성이 높다고 가정하고 그에 따라 공유 자원에 대한 락을 걸어 다른 쓰레드에 대한 접근을 막는 방식입니다. 따라서, 충돌이 빈번하게 일어나는 환경에서 사용하게 되면 효과적일 수 있습니다.

반면에, 낙관적 락은 충돌이 발생하지 않을 것으로 가정하고 그에 따라 공유 자원에 대한 락을 걸지 않고 접근할 수 있습니다. 만약, 다른 쓰레드가 이미 락을 걸어놓은 경우에는 대기하다가 락이 풀리면 자원에 대한 접근을 시도합니다.

실무에서 구체적인 예시를 들면, 낙관적 락은 일반적으로 읽기 비율이 높은 경우에 사용할 수 있습니다. 예를 들어, 게시글을 읽는 쓰레드가 다수 존재하고, 쓰기 작업은 비교적 드물게 발생하는 경우에는 낙관적 락이 효과적일 수 있습니다. 반면에, 쓰기 작업이 빈번하게 발생하는 경우에는 비관적 락을 사용하는 것이 좋습니다.

또한, 실제로 낙관적 락을 구현해서 사용하는 경우도 있습니다. 낙관적 락의 경우, 충돌이 발생하지 않을 것으로 가정하기 때문에 락을 걸지 않다는 것 자체가 성능상 이점을 가질 수 있습니다. 따라서, 낙관적 락을 구현하고 사용하는 것이 효과적일 수 있습니다.

마지막으로, 충돌이 빈번하게 일어난다면 비관적 락이 더 적합한 이유는 충돌이 발생할 가능성이 높다는 것을 가정하고 적극적으로 락을 거는 방식이기 때문입니다. 따라서, 충돌이 발생할 가능성이 높은 경우에는 비관적 락을 사용하는 것이 더 효과적입니다.

이상입니다. 추가적인 질문이 있다면 언제든지 물어보세요. 감사합니다.

니나니노님의 프로필 이미지
니나니노

작성한 질문수

질문하기