Vyk*_*tor 7 mysql innodb transactions table-locking
我需要一些帮助SELECT FOR UPDATE(相应的LOCK IN SHARE MODE).
我有一个大约有40万条记录的表,我需要在每一行上运行两个不同的处理函数.
表结构恰如其分:
data (
`id`,
`mtime`, -- When was data1 set last
`data1`,
`data2` DEFAULT NULL,
`priority1`,
`priority2`,
PRIMARY KEY `id`,
INDEX (`mtime`),
FOREIGN KEY ON `data2`
)
Run Code Online (Sandbox Code Playgroud)
功能有点不同:
priority1; 集data1和mtimepriority2; 集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;
Run Code Online (Sandbox Code Playgroud)
但我所经历的是,每次只有一个查询返回.
所以我的问题是:
SELECT ... FROM (SELECT ...) WHERE ... IN (SELECT)都会受到赞赏)?ORDER BY ... LIMIT ...造成任何问题?在进一步深入之前需要检查的关键事项:
据我所知,顺序和限制不会对您遇到的问题产生任何影响,选择返回的任何内容都将是被锁定的行。
回答您的问题: