【发布时间】: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,使用“事务”,而不是表锁。