且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在PHP中锁定MySQL INNODB行

更新时间: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.