Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Sperren einer MySQL INNODB-Zeile in PHP

$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();

Es ist ein komplexes Thema; Sperren und Transaktionsebenen, aber die Magie oben war der BEGIN Aussage. Ohne sie lief jede Anweisung auf ihrer eigenen Transaktionsebene und der FOR UPDATE Sperre wurde zu früh entsperrt.