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

차영호님의 프로필 이미지
차영호

작성한 질문수

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

Redisson 을 활용하여 재고로직 작성하기

분산 DB 에서 비관적 락을 통한 동시성 제어

작성

·

554

·

수정됨

0

안녕하세요. 분산락을 언제 쓰는게 좋을지 고민하다가 몇 가지 궁금증이 생겨 질문드립니다.

  1. 분산 DB 환경이 무엇을 의미하는지?

흔히 분산 DB 환경에서 낙관적, 비관적 락으로 동시성 문제를 해결하기 힘들다고 얘기하더라고요. 여기서 말하는 분산 DB 라는 것이 샤딩에 의해 여러 DB 서버가 있는 것인지, 동일한 데이터를 저장하는 DB 서버가 여러 대 있는 환경을 의미하는 것인지 모르겠습니다.

예를 들어, Ticket 이란 데이터를 저장하는데 동일한 ticket 데이터가 DB server 1, DB server 2 에 저장되어 있는 환경일까요??

  1. 만약 분산 DB 가 샤딩인 경우 비관적 락으로도 동시성 이슈를 해결할 수 있을 것 같은데 맞을까요?

아래 그림처럼 ticketId = 1 인 티켓을 예매하기 위한 요청이 동시에 올 경우 입니다.

스크린샷 2024-03-16 오후 6.50.34.png

처음 x-lock 을 잡은 요청이 끝나야 뒤늦게 온 요청이 해당 티켓의 잔여 수량을 확인하고 예매 하기 때문에 샤딩으로 인한 분산 DB 에서는 비관적 락으로 동시성 이슈를 해결할 수 있을 것 같습니다.

동일한 Ticket 데이터가 여러 DB 서버에 중복되어 저장된 분산 DB 환경에서는 분산락을 사용해야 될 것 같습니다.

그러나, 샤딩은 동일한 Ticket 데이터에 접근하기 위해서는 동일한 서버로 접근하기 때문에 비관적 락으로도 충분히 해결 가능할 것 같아서 질문 드립니다!

답변 2

0

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

차영호님 안녕하세요.
분산 DB 환경은 여러가지 의미가 있을 수 있을 것 같습니다.

말씀해주신 복제, 샤딩도 하나의 예가 될 수 있을 것 같은데요.
복제라면 단순히 복제만 하기때문에 문제가 되지 않을것이라고 생각됩니다.
다만 샤딩의 경우 1개의 데이터만 수정할 경우에는 문제가 되지 않을 것이라고 생각됩니다.
다만 2개 이상의 데이터를 수정할경우에는 1번 데이터베이스와 2번데이터베이스에서 각각 락을 선점해주어야 하기 때문에 다루기가 까다로울 수 있을 것 같습니다. (데드락에 취약할 것 같습니다)
그렇기때문에 이러한경우에는 비관적락 보다는 다른종류의 lock 을 활용할 것 같습니다. (예를들어 redis 를 활용한 lock)

감사합니다.

0

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

차영호님의 질문에 답변드리겠습니다.

  1. 분산 DB 환경이란 데이터베이스가 물리적으로 다른 위치에 분산되어 있으면서도 사용자에게는 마치 하나의 데이터베이스처럼 동작하도록 구성된 환경을 말합니다. 이는 고가용성, 부하 분산, 데이터의 지리적 분산 처리 등을 목적으로 사용됩니다. 샤딩이란 큰 데이터베이스를 여러 서버에 나누어 저장하는 방식을 포함하며, 복제(replication)는 동일한 데이터를 여러 서버에 저장하여 읽기 성능을 향상시키거나 장애에 대비하는 방식입니다.

  2. 샤딩된 환경에서는 각 샤드에 대한 데이터가 서로 다르기 때문에, 하나의 샤드 내에서 일어나는 트랜잭션의 경우 서버 내에서의 비관적 락을 사용하여 동시성 문제를 관리할 수 있습니다. 그러나, 전체 시스템적으로 보았을 때 여러 샤드 간 트랜잭션 적합성을 유지해야 한다면 분산 트랜잭션 처리가 필요할 수 있고, 이를 위한 분산락이 필요할 수 있습니다.

제공해주신 이미지 설명을 바탕으로, 한 티켓에 대한 접근을 제어하는 상황에서는 샤딩 환경이라면 해당 샤드 내에서 비관적 락(Pessimistic Lock)을 사용하여 동시성 제어가 가능합니다. 데이터가 중복 저장된 분산 DB 환경에서는 각각의 복제본에 대한 일관성을 유지하기 위해 분산락을 고려해야 할 수 있습니다.

도움이 되셨길 바랍니다!

차영호님의 프로필 이미지
차영호

작성한 질문수

질문하기