0


我有以下表格结构。

 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 的所有行,甚至超出日期范围。我也在使用这个唯一键(item_id,date)。

如何仅锁定特定 item_id 的特定日期范围?

问候,
拉维。

4

1 回答 1

1

假设$from_date是 2012-06-15 并且$to_date是 2012-06-16,您实际上是在选择外部范围加上这些日期,因为=s。将您的查询更改为:

SELECT availability FROM reservation 
WHERE item_id={$item_id} AND (date <= '{$to_date}' AND date >= '{$from_date}') 
FOR UPDATE;

更新:

这个

ERROR 1205 (HY000): 超过锁定等待超时;尝试重启事务

意味着,您的查询已中止,导致另一个查询对这些行的锁定时间过长。你最好的办法是找出是什么/哪个查询/交易导致了这种情况,并尝试加快速度。也许这篇文章有帮助。

如果这没有帮助,您可以尝试增加innodb_lock_wait_timeout变量。在手册中阅读有关它的更多信息。

于 2012-06-15T16:02:52.637 回答