해결된 질문
작성
·
262
·
수정됨
답변 3
0
0
아무거나123 님 안녕하세요!
optimistic lock 을 걸게된다면 아래와 같은 쿼리가 실행되게 됩니다.
update stock set quantity = quantity -1, version = 2
where id = 1 and version = 1;
그렇기때문에 이후에 쿼리를 실행할때는 version 이 1인 데이터가 없기때문에 업데이트에 실패하게 됩니다.
업데이트에 실패했으므로 조회부터 다시 시작하게되는 방식입니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
Optimistic Lock
방식은 여러 서버에서 동일한 데이터에 대해 동시에 업데이트를 시도할 때, 데이터의 일관성을 보장하기 위해 사용되는 방법 중 하나입니다. 각 서버에서 동일한 version (예: 1)을 가진 데이터를 읽고 업데이트를 시도할 때, 실제 데이터베이스에 업데이트 쿼리를 실행하는 시점에 version을 확인합니다.
데이터베이스에 저장된 version이 쿼리 실행 시점의 version과 일치할 경우에만 업데이트가 진행되고, version이 증가하여 업데이트됩니다. 만약 다른 서버가 이미 데이터를 업데이트하여 version이 변경되었다면, version 불일치로 인해 OptimisticLockingFailureException
이 발생하고, 해당 트랜잭션은 실패 처리됩니다.
이런 방식으로, 먼저 업데이트를 시도한 요청이 성공하고, 나중에 업데이트를 시도한 요청은 실패하게 됨으로써 동시성 문제에 대한 해결이 가능합니다. 실패한 요청은 예외 처리를 통해 적절한 재시도 로직을 구현할 수 있습니다.
즉, 서로 다른 서버에서 동일한 version의 데이터에 대해 동시에 업데이트를 시도하더라도, 데이터베이스에 실제로 적용되는 업데이트는 한 번에 하나씩만 이루어지며, 이로 인한 데이터 불일치 문제를 방지할 수 있습니다.
님의 질문에 대한 좀 더 상세한 정보는 Spring Data JDBC 문서에서 찾을 수 있습니다.
원문 링크: Spring Data JDBC - Optimistic Locking