使用日期范围时行级别锁定问题

时间:2012-06-15 15:53:11

标签: mysql transactions innodb


我有以下表结构。

 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的特定日期范围?

的问候,
拉维。

1 个答案:

答案 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

中详细了解相关信息