【问题标题】:SELECT on UNION query after LOCK TABLES says table was not locked在 LOCK TABLES 表示表未锁定后对 UNION 查询进行 SELECT
【发布时间】:2017-11-28 17:58:59
【问题描述】:

我需要在代码的特定区域锁定表格。

所以我用 :

锁定了我的桌子

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 在这里有问题,因为没有它,两个查询都可以正常工作。

为什么会这样?

【问题讨论】:

  • 几乎不需要锁定表;你在做什么?
  • 我正在为一个允许人们赢得奖品的网站制作圣诞游戏,其中一个价格非常高,我们只有一个库存,所以我无法让 2 人中奖,这就是我锁定表格的原因。
  • 对于 InnoDB,使用“事务”,而不是表锁。

标签: mysql sql mariadb


【解决方案1】:

你必须锁定两个表,你不能锁定2次同一个表。

解决方案是给表添加别名:

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

然后在你的 Union 中添加相同的别名:

    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')

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 1970-01-01
    • 2014-10-20
    • 2020-06-17
    • 1970-01-01
    • 2013-02-24
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多