【发布时间】:2011-10-14 20:41:27
【问题描述】:
首先,这是问题的简明摘要:
是否可以有条件地运行INSERT 语句?
类似的东西:
IF(expression) INSERT...
现在,我知道我可以使用存储过程来做到这一点。 我的问题是:我可以在我的查询中这样做吗?
现在,我为什么要这样做?
假设我们有以下 2 个表:
products: id, qty_on_hand
orders: id, product_id, qty
现在,假设收到了 20 个巫毒娃娃(产品 ID 2)的订单。
我们首先检查手头是否有足够的数量:
SELECT IF(
( SELECT SUM(qty) FROM orders WHERE product_id = 2 ) + 20
<=
( SELECT qty_on_hand FROM products WHERE id = 2)
, 'true', 'false');
然后,如果计算结果为 true,我们将运行 INSERT 查询。
到目前为止一切顺利。
但是,并发存在问题。
如果有 2 个订单正好同时进来,他们可能在其中任何一个进入订单之前都读取了现有数量。
然后他们都会下订单,从而超过qty_on_hand。
所以,回到问题的根源:
是否可以有条件地运行INSERT 语句,以便我们可以将这两个查询合并为一个?
我搜索了很多,我能找到的唯一类型的条件INSERT 语句是ON DUPLICATE KEY,这显然不适用于这里。
【问题讨论】:
标签: mysql concurrency insert if-statement race-condition