我有以下表结构。
reservation: (InnoDB)
------------------------------------------
id INT,
date DATE,
item_id INT,
slot VARCHAR(50);
PRIMARY KEY(id), UNIQUE KEY(item_id,date).
现在我正在尝试在事务内的预订表上使用SELECT ..... FOR UPDATE来锁定特定item_id的日期范围(例如:2012-06-15到2012-06-16)内的特定行
SELECT availability FROM reservation WHERE item_id={$item_id} AND (date>='{$to_date}' AND date<='{$from_date}') FOR UPDATE
现在当我使用上面的语句时,即使超出日期范围,它也会阻止特定item_id的所有行。我也使用这个UNIQUE KEY(item_id,date)。
如何仅锁定特定item_id的特定日期范围?
的问候,
拉维。
答案 0 :(得分:1)
假设$from_date
是2012-06-15且$to_date
是2012-06-16,您实际上是在选择外部范围加上=
的原因。将您的查询更改为:
SELECT availability FROM reservation
WHERE item_id={$item_id} AND (date <= '{$to_date}' AND date >= '{$from_date}')
FOR UPDATE;
<强>更新强>
此
ERROR 1205(HY000):超出锁定等待超时;尝试重新启动 交易
表示您的查询已中止,导致另一个查询持续锁定这些行太长时间。您最好的办法是找出导致此问题的查询/事务/尝试加快速度。也许this article有帮助。
如果这没有帮助,您可以尝试增加innodb_lock_wait_timeout
变量。请在manual。