데이터베이스에서 발생하는 동시성 문제(lost update)를 해결하는 네 가지 대표적인 방법인 낙관적 락과 비관적 락, 프로그램 차원에서의 락, Redis 사용에 대해서 간략하게 정리해보겠음
트랜잭션들이 동시에 같은 데이터를 수정하는 일이 자주 발생하지 않는다는 가정 하에,
데이터 수정 시점에 버전 정보(version field)를 기준으로 충돌을 감지하고 예외 처리를 한다.
예를 들어, 두 트랜잭션 A, B가 version=1을 읽은 상태에서 동시에 수정 시도할 때:
version=1 → version=2 로 업데이트에 성공 version=1로부터 업데이트를 시도하지만, 이미 버전이 바뀌어 실패(에러 발생) 낙관적 락은 DB 락을 사용하지 않고, 버전 필드를 통해 충돌을 감지하는 방식이기에 동시성 성능에는 유리하다.
JPA 등의 ORM 도구에서는 보통 @Version 어노테이션을 사용해 손쉽게 구현 가능하다.
-- 예시: UPDATE 시 버전 검사하는 쿼리
UPDATE account
SET balance = balance - 100, version = version + 1
WHERE user_id = 1 AND version = 1;
SELECT ... FOR UPDATE 구문등으로 특정 행에 배타적 락을 건다. - 배타락과 공유락이 있다.
-- 배타락 예시
SELECT post_count INTO cnt
FROM author
WHERE id = 2 FOR UPDATE;
synchronized 같은 동기화 기법과 유사한 원리다.

동시성문제를 해결하는 프로젝트를 진행해볼 수 있으면 좋은 양분이 될거같다.
낙관적 락과 비관적 락?
이건 뭐 거의 비틀즈 수준이죠 이건 뭐…
정말 낭만있네요 낭만개발자 이지연으로 이름바꾸세요