我需要一点帮助SELECT FOR UPDATE
(resp. LOCK IN SHARE MODE
)。
我有一个包含大约 400 000 条记录的表,我需要在每一行上运行两个不同的处理函数。
表结构适当地是这样的:
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
- 第二个功能- 必须在每条记录上只运行一次(非常慢),应该根据
priority2
;选择记录 集data1
和mtime
他们不应该同时修改同一行,但是 select 可能会在两者中返回一行(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;
但我所经历的是,每次只有一个查询返回。
所以我的问题是:
- 是否可以在不同的行(在同一个表中)的两个独立事务中获取两个独立的锁?
- 我在第一个和第二个查询之间有那么多冲突吗(我在调试时遇到了麻烦,任何关于如何调试的提示
SELECT ... FROM (SELECT ...) WHERE ... IN (SELECT)
都将不胜感激)? ORDER BY ... LIMIT ...
会导致任何问题吗?- 索引和键会导致任何问题吗?