更新时间:2023-02-07 18:44:04
$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.