작성
·
3.6K
0
낙관 락과 비관 락을 정확히 언제 사용하는지 궁금한데요, 충돌이 잦을 때는 비관 락을 사용한다고 이해하기엔 막연한 느낌이 있어서요, 혹시 실무에서 구체적인 예시를 들어주실 수 있을까요??
비관적 락이 구현이 훨씬 간단할 것 같은데, 실제로 실무에서 비관적 락이 아닌 낙관적 락을 직접 구현해서 사용할 일이 있는지도 궁금합니다.
충돌이 빈번하게 일어난다면 비관적 락이 더 적합할 수 있다고 하셨는데 이유가 뭔가요? 어떤 부분에서 성능상 이점이 있는지 궁금합니다.
자세하게 설명해주시면 정말 감사할 것 같습니다. 감사합니다!!
답변 2
3
니나니노님 안녕하세요.
낙관적락과 비관적락을 사용하는 기준은 "동시에 수정을 하는일이 빈번하게 일어나는가 ?" 입니다.
그렇기때문에 동일한 사례에서도 동시에 수정을 하는일이 적다면 낙관적락을, 동시에 수정하는 상황이 빈번하게 일어난다면 비관적락을 사용한다고 이해하시면 좋을 것 같습니다.
예를들어 1000명의 사용자가 동시에 A 라는 상품을 구매할 때 "충돌이 빈번하게 일어난다" 라고 생각할 수 있을 것 같습니다.
반대로 1000명의 사용자가 A 라는 상품을 구매하지만 구매시간이 각자 다를 때 (예를들어 사용자 1은 1시에, 사용자 2는 1시 1분에 사용자 3은 1시 2분에...) "충돌이 비교적 적게 일어난다" 라고 생각할 수 있을 것 같습니다.
낙관적락의 구현은 JPA 을 사용한다면 크게 어렵지 않게 구현할 수 있기때문에 실무에서도 사용됩니다.
충돌이 빈번하게 일어나는 상황에서 낙관적락을 사용하게 된다면 모든 요청이 완료될때까지 재시도를 수행할 것 입니다.
예를들어 1000 개의 동시수정이 발생한다면 1000 개의 요청이 모두 완료될때까지 재시도를 수행할 것 입니다.
구현마다 다르겠지만 성공할때까지 시도한다고 가정했을 때 데이터베이스에 굉장히 많은 요청을 보내게 될 것입니다.
반면에 비관적락을 사용한다면 lock 을 걸고 수행하기때문에 이후의 요청들은 업데이트가 완료될때까지 기다렸다가 순차적으로 진행하게 됩니다.
이러한 관점에서 봤을 때 충돌가능성이 많다면 비관적락이 더 좋은선택이 될 수 있습니다.
감사합니다!
1
안녕하세요, 인프런 AI 인턴입니다.
낙관 락과 비관 락은 동시성 제어에 있어서 사용되는 방식 중 하나입니다.
비관적 락은 공유 자원을 사용할 때 다른 쓰레드와 충돌이 발생할 가능성이 높다고 가정하고 그에 따라 공유 자원에 대한 락을 걸어 다른 쓰레드에 대한 접근을 막는 방식입니다. 따라서, 충돌이 빈번하게 일어나는 환경에서 사용하게 되면 효과적일 수 있습니다.
반면에, 낙관적 락은 충돌이 발생하지 않을 것으로 가정하고 그에 따라 공유 자원에 대한 락을 걸지 않고 접근할 수 있습니다. 만약, 다른 쓰레드가 이미 락을 걸어놓은 경우에는 대기하다가 락이 풀리면 자원에 대한 접근을 시도합니다.
실무에서 구체적인 예시를 들면, 낙관적 락은 일반적으로 읽기 비율이 높은 경우에 사용할 수 있습니다. 예를 들어, 게시글을 읽는 쓰레드가 다수 존재하고, 쓰기 작업은 비교적 드물게 발생하는 경우에는 낙관적 락이 효과적일 수 있습니다. 반면에, 쓰기 작업이 빈번하게 발생하는 경우에는 비관적 락을 사용하는 것이 좋습니다.
또한, 실제로 낙관적 락을 구현해서 사용하는 경우도 있습니다. 낙관적 락의 경우, 충돌이 발생하지 않을 것으로 가정하기 때문에 락을 걸지 않다는 것 자체가 성능상 이점을 가질 수 있습니다. 따라서, 낙관적 락을 구현하고 사용하는 것이 효과적일 수 있습니다.
마지막으로, 충돌이 빈번하게 일어난다면 비관적 락이 더 적합한 이유는 충돌이 발생할 가능성이 높다는 것을 가정하고 적극적으로 락을 거는 방식이기 때문입니다. 따라서, 충돌이 발생할 가능성이 높은 경우에는 비관적 락을 사용하는 것이 더 효과적입니다.
이상입니다. 추가적인 질문이 있다면 언제든지 물어보세요. 감사합니다.