픽의 태그 수정 시 터지는 동시성 문제 #675
Replies: 1 comment
-
찾아보니 SELECT ... FOR UPDATE 은 제대로 동작한게 맞습니다. INNODB 공식 설명을 다시 한번 유심히 봤습니다.
SELECT … FOR UPDATE 은 ...
따라서 위 쿼리는 Innodb의 방식대로 잘 돌아간 게 맞네요. 근본적 문제는, 들어온 요청 순서와 쿼리 실행 순서가 달라서인 것으로 보입니다. 해결법은 요청 순서대로 태그 Read-Update-Commit이 동작하도록 보장하는 것 같습니다.
결국은 지금 설계에서 유일한 해결책은 네임드락 뿐이네요.... 정리하면 |
Beta Was this translation helpful? Give feedback.
-
MySQL Log
MySQL Log 설정
참고 링크
Application Log
위에 로그를 살펴보면, PickTag에 7, 8, 9, 10, 11 값이 insert 되었음.
Pick에 있는 tag_order의 경우도 '7 8 9 10 11'로 update 되었음.
이미 PickTag 테이블에 7, 8, 9, 10, 11이 존재하므로 10을 넣지 못함.
그렇기 때문에 unique index 조건에 걸리게 되어 예외가 발생하게 됨.
그렇다면, 프론트엔드에서 요청은 어떻게 날라왔을까? 순서는 어떻게 넘어왔을까?
프론트엔드 요청
1. [7, 8] 요청
2. [7, 8, 9] 요청
3. [7, 8, 9, 10] 요청
4. [7, 8, 9, 10, 11] 요청
1 -> 2 -> 3 -> 4 순서로 요청을 진행하였음.
하지만, 실제 DB에는 3번째 4번째 요청이 동시에 진행되었음.
즉, 동시성 문제가 발생했다는 것.
결론
프론트에서 요청의 순서를 보장해서 보내줘야 할 것인가?
백엔드에서 당연히 락을 걸어서 동시성 제어를 할 것이다.
백엔드에서 픽 수정하는 부분에 대하여 비관적 락이 걸려있으나, 비관적 락은 무시되었다.
Beta Was this translation helpful? Give feedback.
All reactions