问题是MySQL InnoDB表中同时选择和更新的行为:
我们有一个相对较大的表,我们定期扫描读取几个字段,包括一个名为LastUpdate的字段。在扫描期间,我们更新先前扫描过的行。更新是在后台线程中批处理和执行的--使用不同的连接。需要注意的是,我们更新了已经读取的行。
三个问题:
发布于 2016-06-25 22:53:31
忽略这个问题,编写不会遇到麻烦的代码:
BEGIN;
SELECT id ... LIMIT 20; -- get list of _possible_ candidates for action
COMMIT;
**
foreach $candidate
BEGIN;
SELECT ..., is_candidate WHERE id = $candidate FOR UPDATE;
if still a candidate
process it
UPDATE ...;
COMMIT;如果有人溜进来,比如说,在**,稍后的检查将防止双重处理.此外,第二个BEGIN..COMMIT防止任何人溜进来。
FOR UPDATE“锁定”行;这很重要。
这种处理方式的优点是事务处理速度快,从而将对其他一切的影响降到最低。
https://stackoverflow.com/questions/37764677
复制相似问题