source

LOCK TABLES가 테이블이 잠기지 않았다고 말한 후 UNION 쿼리에서 선택

lovecheck 2022. 12. 18. 08:38
반응형

LOCK TABLES가 테이블이 잠기지 않았다고 말한 후 UNION 쿼리에서 선택

코드의 특정 영역에 테이블을 잠글 필요가 있습니다.

그래서 테이블은 다음과 같이 잠급니다.

LOCK TABLE christmas_game WRITE;

잘 먹히네요.

이제 나는SELECT이 테이블 위에 올려놓기 때문에 이렇게 하겠습니다.

SELECT SQL_NO_CACHE prize
FROM christmas_game
WHERE user_id = {$this->user_id}
ORDER BY created_at DESC
LIMIT 2

그것도 잘 되는군.그러나 이것은 어떤 이유로도 전혀 동작하지 않습니다.

SELECT prize
FROM christmas_game
WHERE DATE(created_at) = CURDATE()
AND user_id != '{$uniqId}'
GROUP BY prize
UNION
SELECT prize
FROM christmas_game
WHERE user_id = {$user->user_id}
AND user_id != '{$uniqId}'
AND prize IN ('promo_1', 'promo_2')

다음과 같은 오류가 나타납니다.Table 'christmas_game' was not locked with LOCK TABLES. 물론 그UNION두 쿼리 모두 문제없이 정상적으로 동작하기 때문에 여기서 문제가 발생합니다.

왜 그런 것일까요?

양쪽 테이블을 잠궈야 하고, 같은 테이블을 두 번 잠글 수 없습니다.

해결방법은 테이블에 에일리어스를 추가하는 것입니다.

LOCK TABLE christmas_game as table_locked_game_1 WRITE, christmas_game as table_locked_game_2 write;

그런 다음 동일한 별칭을 유니언에 추가합니다.

    SELECT prize 
    FROM christmas_game as table_locked_game_1 
    WHERE DATE(created_at) = CURDATE() GROUP BY prize 
UNION 
    SELECT prize FROM christmas_game as table_locked_game_2 
    WHERE user_id = 81 
    AND prize IN ('promo_1', 'promo_2')

언급URL : https://stackoverflow.com/questions/47538074/select-on-union-query-after-lock-tables-says-table-was-not-locked

반응형