강의

멘토링

로드맵

Inflearn brand logo image

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

springYam님의 프로필 이미지
springYam

작성한 질문수

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

비관적 락 VS 네임드 락

작성

·

108

0

안녕하세요. 해당 강의를 통해 다양한 락의 특징과 장단점을 배울 수 있어 현재 프로젝트에 적용할 수 있었습니다.

적용한 부분: 상품 재고 감소에 대한 동시성 제어
적용했던 락: 네임드 락
적용한 이유: 상품 테이블에 재고 컬럼이 포함되어 있기 때문에 비관적 락을 적용할 경우, 해당 row를 단순 조회하거나 다른 비즈니스 로직에서 락 대기 등으로 인해 영향을 미칠 수 있을 것이라 판단하여 네임드 락을 적용했습니다.

궁금한 점: 적용 이후 테스트 과정에서 알게 된 점이, MySQL의 단순 select 쿼리는 FOR UPDATE로 인해 락이 걸린 row를 조회하더라도 락 대기나 차단이 발생하지 않는다는 사실이었습니다. 또한 네임드 락과 비관적 락 간의 부하 테스트 결과, 성능 차이가 거의 없다는 점에서, 정합성이 중요한 주문/결제 상황이라면 낙관적 락은 배제하고, 오히려 네임드 락보다는 비관적 락을 적용하는 것이 더 적절하지 않을까 하는 의문이 들었습니다.

질문: 상품 테이블에 재고 컬럼이 포함되어 있다고 하더라도 단순 조회 성능에 영향을 주지 않는다는 점에서, 네임드 락보다 비관적 락을 적용하는 것이 더 타당한 선택일지 궁금합니다. 실무적인 기준에서 어떤 판단이 더 적절할지 조언 부탁드립니다.

답변 3

0

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

springYam 님 안녕하세요.
예시와 같이 한개의 Table 만 수정하는경우에는 말씀하신대로 비관적락이 더 효율적일 수 있을듯합니다.
다만, 실무에서는 재고수정을 할 때 한개의 Table만 수정하는 일은 드물거라고 생각합니다.
여러개의 Table 의 데이터가 수정될때는 여러 Table, 여러 raw 에 대해 락을 잡게 됩니다.
이렇게되면 데드락에 취약해질 수 있다는 단점이 있고, 롱트랜잭션으로 이어질 수 있는 가능성이 열리게 됩니다.
이러한점으로 인하여 여러 Table 의 데이터를 수정할때에는 네임드락을 통한제어나, redis 를 통한 분산락이 효율적일 수 있습니다.

0

springYam님의 프로필 이미지
springYam
질문자

비관적 락 -> 다른 트랜잭션이 같은 row에 접근할 수 없다

네임드 락 -> 다른 트랜잭션이 같은 락 이름을 가지고 접근할 수 없다
이렇게 놓고 보았을때도 성능이나 다른 부분에서 차이가 있을까요??

0

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

비관적 락과 네임드 락 사용에 관한 중요한 질문을 주셨습니다. 순서에 따라서 각 락이 어떠한 환경에서 더 나은 선택이 될 수 있는지를 살펴보겠습니다.

  1. 비관적 락(Pessimistic Lock):

    • 장점: 데이터의 정합성을 철저히 보장합니다. 트랜잭션이 완료될 때까지 데이터에 대한 다른 트랜잭션 접근을 철저히 제어하므로, 데이터 일관성이 우선인 환경에서 적합합니다.
    • 단점: 락 대기로 인한 다른 트랜잭션의 지연이 발생할 수 있으며, 데드락 등의 문제 발생 가능성이 있습니다.
  2. 네임드 락(Named Lock):

    • 장점: 비관적 락에 비해 더 유연하게 동작할 수 있습니다. 특정 리소스를 락하지만, 트랜잭션 단위보다 더 광범위하거나 좁은 범위의 락을 걸 수 있습니다.
    • 단점: 적절한 이름 설계를 통한 락 관리가 필요하므로, 관리의 복잡도가 증가할 수 있습니다.
  3. 실무 적용 조언:

    • 주문/결제 시스템의 정합성 유지: 동일한 행(row)에 여러 트랜잭션이 동시에 접근하려 할 때 정합성 유지를 최우선적으로 고려해야 한다면, 비관적 락을 적용하는 것이 타당할 것입니다.
    • 성능과 유연성 사이의 균형: 네임드 락은 성능적으로 비슷하지만 더 유연하게 관리할 수 있다는 점에서 다른 비즈니스 요구 사항에 적절함을 제공할 수 있습니다. 예를 들어, 시스템 간 포인트 연계를 위한 별도 로직에서는 네임드 락을 고려할 수 있습니다.

추가로, MySQL의 비관적 락에서 발생할 수 있는 락 대기와 차단 이슈가 발생하지 않는 점을 궁금해하셨습니다. 이는 특정 트랜잭션 격리 수준이나 특정 조건에 따라 달라질 수 있으니, 실제 운영 환경에서의 SQL 로그 및 트랜잭션 흐름을 면밀히 모니터링하는 것이 필요합니다.

아래 관련된 기존 답변도 검토해보시면 도움이 될 것입니다:
- 비관적 락에 대한 질문.
- DB락과 분산락

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

springYam님의 프로필 이미지
springYam

작성한 질문수

질문하기