재고 차감 동시성: FOR UPDATE, 조건부 UPDATE, 버전 컬럼 비교
재고가 음수가 되는 lost update를 psql 두 창으로 재현하고, SELECT FOR UPDATE, 조건부 UPDATE, 버전 컬럼 낙관적 잠금을 같은 부하에서 비교했다. 처리량, 재시도, 코드 복잡도를 기준으로 언제 무엇을 쓰는지 적었다.
격리 수준, 잠금, 교착 상태를 겪고 정리한 것
재고가 음수가 되는 lost update를 psql 두 창으로 재현하고, SELECT FOR UPDATE, 조건부 UPDATE, 버전 컬럼 낙관적 잠금을 같은 부하에서 비교했다. 처리량, 재시도, 코드 복잡도를 기준으로 언제 무엇을 쓰는지 적었다.
같은 동시 업데이트를 PostgreSQL과 MySQL의 REPEATABLE READ에서 돌려 보면 PostgreSQL은 직렬화 오류를 내고 MySQL은 최신 값 위에 덮어쓴다. 두 DB가 스냅샷을 잡는 시점도 다르다. 실험 쿼리와 함께 차이를 짚는다.
SHOW ENGINE INNODB STATUS의 교착 로그에 찍히는 lock_mode, rec but not gap, gap before rec, insert intention을 한 줄씩 풀고, 로그에 남지 않는 앞선 쿼리까지 거슬러 올라가 원인을 찾는다.
MySQL REPEATABLE READ에서 없는 행에 SELECT ... FOR UPDATE를 걸면 두 트랜잭션이 같은 갭 락을 나눠 잡고 서로의 삽입 의도 잠금을 막는다. 재현 순서와 세 가지 해법의 장단점을 비교한다.