问题是关于MySQL InnoDB表中同时进行SELECT和UPDATE的行为:
我们有一个相对较大的表,我们定期对其进行扫描以读取多个字段,其中包括一个名为的字段LastUpdate
。在扫描过程中,我们更新以前扫描的行。使用不同的连接,批处理更新并在后台线程中执行。重要的是要注意,我们将更新已读取的行。
三个问题:
忽略该问题,并编写不会遇到麻烦的代码:
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
“锁定”行;这个很重要。
以这种方式进行处理的优点是交易速度很快,从而将对其他所有事务的影响降到最低。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句