SELECT ... FOR UPDATE, INSERT에서 DeadLock 발생

GwanMtCat·2023년 11월 25일
0

취준을 위해 열심히 과제를 푸는 도중에 동시성 관련 문제가 있어서
테스트 코드를 작성했는데 생각처럼 동작하지 않는 것이다.
관련해서 적어보겠다.

문제의 코드는 이렇다.

  1. Point를 쌓기 위해 userId로 select...for update 구문으로 xLock을 걸고
  2. Reserve가 존재하지 않으면 Reserve를 새로 생성하고
  3. Reserve가 존재했다면 갱신해주는 것이다.

나는 당연히 제대로 동작하겠다 싶어 테스트 코드를 그대로 작성했다.

결과는?

데드락이 발생하면서 예상한 100점이 쌓이어야 하는 것돠 달리 80점이 쌓였다. 왜그런걸까?
(그림의 값을 반대로 넣었네...)

쿼리를 분석해보면 나는 데이터가 없는 테이블에 xLock을 걸었기 때문에 락은 이미 효과가 없다. 즉 적용이 되지 않는다.

관련해서는 여길 참조하자.

0개의 댓글