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

세진:)님의 프로필 이미지
세진:)

작성한 질문수

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

Optimistic Lock 활용해보기

충돌의 기준이 무엇인가여?

작성

·

315

·

수정됨

0

 

Optimistic Lock은 충돌이 빈번할 경우 적절하지 않다고 하는데, 충돌이 기준이 어떤건지 궁금합니다.

 

별도로 프로젝트에서 Mybatis랑 같이 쿠폰발급 프로젝트에서 응용중입니다.

전 쿠폰 500개를 기준으로 발급된 수량을 합산하는 로직입니다.

스레드 100개기준으로 동시성테스트를 진행했을때 69개만 적용되더라구요. 재시도 로직에서 Thread.sleep(1000)으로 하면 98개까지 적용됩니다.

 

그런데 스레드 10개를 기준으로 동시성 테스트를 진행했을때는 정합성이 맞고, 스레드1000개를 돌려버리면 500개가 전부다 발급됩니다. 1000개 중에 몇개는 실패하고, 몇개는 성공하고 그래서 500개 전부 다 발급된 상황이라고 예상됩니다.


Q1. 충돌이 많은 상황이라는게 동시에 여러 스레드가 접근하는 걸 의미하는게 맞나요? 충돌의 기준은 무엇인지, 어플리케이션 내부 로직마다 다른걸까요?

Q2. 충돌이 빈번하지 않을때 낙관적락을 사용하는 경우가 어떤 경우인지 궁금합니다.. 정합성이 많이 떨어진다고 생각하는데 실제로 현업에서 많이 사용하나요?

Q3. 데이터베이스에 락을 걸지 않아서 성능상 이점이 있다고 하셨는데, 제가 테스트해봤을때는 pessimisticLock보다 Mysql에 더 부하가 많이가더라구요. 재시도로직으로 I/O작업이 더 많이 일어나서 그런것 같은데, 말씀하시는 '성능상 이점'이라는건 어떤건지 궁금합니다.

답변 2

0

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

세진님 안녕하세요!
답변이 늦어져서 죄송합니다.

Q1. 충돌이 많은 상황이라는게 동시에 여러 스레드가 접근하는 걸 의미하는게 맞나요? 충돌의 기준은 무엇인지, 어플리케이션 내부 로직마다 다른걸까요?
A1. 여러 스레드가 동시에 업데이트를 시도하여 실패가 발생하는 케이스를 충돌이라고 표현하였습니다.
여러 스레드가 동시에 업데이트를 시도한다면 실패하는 케이스가 많이 일어나고 그로인해 재시도 또한 많아지기 때문입니다.

Q2. 충돌이 빈번하지 않을때 낙관적락을 사용하는 경우가 어떤 경우인지 궁금합니다.. 정합성이 많이 떨어진다고 생각하는데 실제로 현업에서 많이 사용하나요?
A2. 트래픽이 많지 않은상황 (예를들어 1분에 1건의 주문만 발생) 일경우에는 낙관적락을 사용할 수 있을 것 같습니다. 정합성이 떨어진다고 생각하시는 이유가 궁금합니다.

Q3. 데이터베이스에 락을 걸지 않아서 성능상 이점이 있다고 하셨는데, 제가 테스트해봤을때는 pessimisticLock보다 Mysql에 더 부하가 많이가더라구요. 재시도로직으로 I/O작업이 더 많이 일어나서 그런것 같은데, 말씀하시는 '성능상 이점'이라는건 어떤건지 궁금합니다.
A3. 낙관적락과 비교하여 질문을 주신듯 합니다. 충돌이 많지않은 상황에서 락을 걸지 않기때문에 가볍게 로직을 수행할 수 있습니다. 별도로 락을 잡지 않아도 되기때문에 작업이 가벼워져 성능상 이점이 존재합니다.
반면 충돌이 많은 상황에서는 말씀하신것처럼 재시도로직으로 인하여 부하가 발생할 수 있습니다.
그렇기때문에 충돌이 빈번한 상황에서는 pessimisticLock 을 사용하는 것이 좋을 수 있습니다.

 

감사합니다.

0

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

Q1. 충돌이란 여러 스레드나 프로세스가 같은 데이터에 대해 동시에 작업을 시도할 때 발생하는 문제를 의미합니다. 충돌의 기준은 특정 애플리케이션이나 환경에 따라 다를 수 있으며, 동시에 접근하는 요청의 수, 데이터의 종류, 처리하는 로직의 복잡성 등 다양한 요소에 의해 결정됩니다. 크게 자주 발생하지 않는 수준의 동시성 요청을 처리하는 경우와 거의 항상 여러 요청이 동시에 발생하는 수준으로 구분될 수 있습니다.

Q2. 낙관적 락은 충돌 가능성이 낮거나 데이터의 일관성 유지가 절대적으로 필수적이지 않은 경우에 유용합니다. 예를 들어 복잡하지 않은 조회를 주로 하고, 간헐적으로 업데이트가 일어나는 애플리케이션에서 사용할 수 있습니다. 실제 현업에서는 낙관적 락과 비관적 락을 사용 상황에 따라 선택하여 사용합니다.

Q3. 성능상의 이점은 상황에 따라 다릅니다. 낙관적 락은 락을 걸지 않아서 데이터의 보호가 필요한 짧은 시간 동안의 성능 저하를 방지할 수 있습니다. 하지만, 충돌이 빈번하게 발생하거나 재시도 로직이 복잡할 경우, 오히려 낙관적 락이 성능 저하를 일으킬 수 있습니다. 성능상 이점은 충돌의 빈도와 재시도 로직의 효율성에 크게 좌우됩니다.

스프링 데이터 JDBC의 낙관적 락에 대한 자세한 내용은 공식 문서를 참고하시면 좋을 것 같습니다.
- 참고 링크: Spring Data JDBC - Optimistic Locking

질문에 도움이 되었기를 바랍니다. 추가적인 궁금증이 있으시면 언제든 문의해주세요.

세진:)님의 프로필 이미지
세진:)

작성한 질문수

질문하기