MariaDB에서 SELECT ... FOR UPDATE LIMIT 1 의 Lock 범위. 0 2 2,758

by Polygon [MySQL] MariaDB MySQL SQL Lock Performance [2021.07.28 17:23:08]


' SELECT ... FOR UPDATE LIMIT 1 SKIP LOCKED '

이라는 구문을 사용하고 있습니다.

n개의 row가 있을 때에 1번째의 row만 가져오고. 만약 1번째의 row가 locked 된 상태라면 2번째의 row을 가져오게 할려고 위와 같은 쿼리를 사용하는데. 무엇이 문제인지 병목현상이 일어납니다.

궁금한 것은 다음과 같습니다.

 

1. Limit 1 은 SKIP Locked 의 영향을 받지 않고 Locked 된 항상 1번째 Row만 가져올려고 하는지.

2. SELECT ... FOR UPDATE LIMIT 1 의 LOCK 범위가 LIMIT의 대상이 되는 Row 전체가 되는지.

3. 위 둘다 해당 되는지.

 

아무리 찾아봐도 나오지 않아서 이렇게 질문을 올려봅니다.

 

만약 아시는 분이 계신다면, 답변 해 주신다면 감사하겠습니다.

by 축구쟁이 [2021.07.29 10:36:36]

1. SKIP LOCKED가 적용된 결과에서 LIMIT을 통해 필터링되는 형태인 것으로 알고 있습니다.

다른 세션 2개로 테스트 해보면 확인 가능합니다.

2. 테스트해본 결과 LIMIT이 있을 경우 LIMIT에 의해 필터링된 결과 값만 lock이 걸리는 것으로 확인되었습니다.

 

이런 사항들은 버전마다 다를 수 있으므로 꼭 해당 버전에서 테스트 해보시는게 좋을 것 같습니다.


by Polygon [2021.07.30 10:35:41]

아무래도 쿼리중에 다른 이유 때문에 병목현상이 일어나는 것 같군요.

DB 쪽은 아직 익숙하지 않아서 어떻게 테스트를 해야할지 많이 헤매어서...

답변 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입