SELECT FOR UPDATE
(またはLOCK IN SHARE MODE
)について少し助けが必要です。
約400000レコードのテーブルがあり、各行で2つの異なる処理関数を実行する必要があります。
テーブル構造は適切に次のとおりです。
data (
`id`,
`mtime`, -- When was data1 set last
`data1`,
`data2` DEFAULT NULL,
`priority1`,
`priority2`,
PRIMARY KEY `id`,
INDEX (`mtime`),
FOREIGN KEY ON `data2`
)
関数は少し異なります:
- 最初の関数-すべてのレコードでループで実行する必要があり(かなり高速)、;に基づいてレコードを選択する必要があります
priority1
。セットdata1
とmtime
- 2番目の関数-各レコードで1回だけ実行する必要があり(かなり遅い)、;に基づいてレコードを選択する必要があります
priority2
。セットdata1
とmtime
同じ行を同時に変更するべきではありませんが、selectは両方で1つの行を返す可能性があり(priority1
値priority2
が異なります)、その場合はトランザクションが待機しても問題ありません(これが当てはまると思います)ブロックする唯一のケースです)。
次のクエリに基づいてデータを選択しています。
-- For the first function - not processed first, then the oldest,
-- the same age goes based on priority
SELECT id FROM data ORDER BY mtime IS NULL DESC, mtime, priority1 LIMIT 250 FOR UPDATE;
-- For the second function - only processed not processed order by priority
SELECT if FROM data ORDER BY priority2 WHERE data2 IS NULL LIMIT 50 FOR UPDATE;
しかし、私が経験しているのは、毎回1つのクエリだけが返されるということです。
だから私の質問は:
- (同じテーブル内の)別々の行の束で2つの別々のトランザクションで2つの別々のロックを取得することは可能ですか?
- 最初のクエリと2番目のクエリの間にこれほど多くの衝突がありますか(デバッグに問題があります。デバッグ方法のヒントを
SELECT ... FROM (SELECT ...) WHERE ... IN (SELECT)
いただければ幸いです)。 ORDER BY ... LIMIT ...
問題を引き起こす可能性がありますか?- インデックスとキーは問題を引き起こす可能性がありますか?