更新时间:2023-02-07 18:30:37
$mysqli->autocommit(FALSE);
$mysqli->query("BEGIN;");
$mysqli->multi_query("SELECT id FROM links WHERE id > (SELECT value FROM meta WHERE name='scan' FOR UPDATE) LIMIT 1000;UPDATE meta SET value=value+1000 WHERE name='scan';");
$mysqli->commit();
这是一个复杂的问题;锁定和事务级别,但上面的魔术是 BEGIN
语句.没有它,每条语句都在自己的事务级别上运行,并且 FOR UPDATE
锁被解锁得太早了.
It's a complex issue; locking and transaction levels, but the magic above was the BEGIN
statement. Without it, each statement was running in its own transaction level, and the FOR UPDATE
lock was being unlocked too early.