• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

Optimistic Lock 버전 관리 질문

24.05.23 07:53 작성 24.05.23 07:55 수정 조회수 115

0

버전 관리를 통하여 동시성을 피할수 있다고 하셨는데, 서로 다른 서버에서 동시에 version = 1 인 데이터룰 얻고, 동시에 stock = stock + 1, version = 2 로 업데이트 치면 optimistic lock 또한 동시성이 발생할 수 있는 것 아닌가요?

 

 강의에서는 version = 1 인 데이터를 동시에 얻지만 업데이트는 순차적으로 하는 표만 보여주셔서 헷갈려요. 순차적으로 할 수 밖에 없는 메커니즘이라면 그 부분을 설명해주셨으면 좋겠습니다.

답변 3

·

답변을 작성해보세요.

0

isolation level 이 기본적으로 READ COMMITTED 이상인 경우라고 가정한다고 생각하고 이해하겠습니다.

0

아무거나123 님 안녕하세요!
optimistic lock 을 걸게된다면 아래와 같은 쿼리가 실행되게 됩니다.

update stock set quantity = quantity -1, version = 2
where id = 1 and version = 1;

그렇기때문에 이후에 쿼리를 실행할때는 version 이 1인 데이터가 없기때문에 업데이트에 실패하게 됩니다.
업데이트에 실패했으므로 조회부터 다시 시작하게되는 방식입니다.

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.25

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

Optimistic Lock 방식은 여러 서버에서 동일한 데이터에 대해 동시에 업데이트를 시도할 때, 데이터의 일관성을 보장하기 위해 사용되는 방법 중 하나입니다. 각 서버에서 동일한 version (예: 1)을 가진 데이터를 읽고 업데이트를 시도할 때, 실제 데이터베이스에 업데이트 쿼리를 실행하는 시점에 version을 확인합니다.

데이터베이스에 저장된 version이 쿼리 실행 시점의 version과 일치할 경우에만 업데이트가 진행되고, version이 증가하여 업데이트됩니다. 만약 다른 서버가 이미 데이터를 업데이트하여 version이 변경되었다면, version 불일치로 인해 OptimisticLockingFailureException이 발생하고, 해당 트랜잭션은 실패 처리됩니다.

이런 방식으로, 먼저 업데이트를 시도한 요청이 성공하고, 나중에 업데이트를 시도한 요청은 실패하게 됨으로써 동시성 문제에 대한 해결이 가능합니다. 실패한 요청은 예외 처리를 통해 적절한 재시도 로직을 구현할 수 있습니다.

즉, 서로 다른 서버에서 동일한 version의 데이터에 대해 동시에 업데이트를 시도하더라도, 데이터베이스에 실제로 적용되는 업데이트는 한 번에 하나씩만 이루어지며, 이로 인한 데이터 불일치 문제를 방지할 수 있습니다.

님의 질문에 대한 좀 더 상세한 정보는 Spring Data JDBC 문서에서 찾을 수 있습니다.
원문 링크: Spring Data JDBC - Optimistic Locking

채널톡 아이콘