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 のすべての行がブロックされます。この UNIQUE KEY(item_id,date) も使用しています。

特定の item_id の特定の日付範囲のみをロックする方法は?

よろしく、
ラビ。

4

1 に答える 1

1

$from_dateそれが2012-06-15であり、2012-06-16であると仮定すると、$to_date実際には外側の範囲とそれらの日付を選択していることになり=ます。クエリを次のように変更します。

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

アップデート:

これ

エラー1205(HY000):ロック待機タイムアウトを超えました。トランザクションを再開してみてください

つまり、クエリが中止されたため、別のクエリがそれらの行のロックを長時間保持しているためです。あなたの最善の策は、これを引き起こしている/どのクエリ/トランザクションを見つけて、これをスピードアップしようとすることです。たぶん、この記事は役に立ちます。

これで問題が解決しない場合は、innodb_lock_wait_timeout変数を増やしてみてください。詳細については、マニュアルをご覧ください。

于 2012-06-15T16:02:52.637 に答える