我需要一点关于 SELECT FOR UPDATE
(或者 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
它们不应同时修改同一行,但是选择可能会在两者中返回一行(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.我是不是在第一个和第二个查询之间有很多冲突(我有困难调试这个问题,任何关于如何调试“SELECT ... FROM (SELECT ...) WHERE ... IN (SELECT)”的提示都将不胜感激)?
3.
ORDER BY ... LIMIT ...
会引起任何问题吗?4.索引和键会引起任何问题吗?