sql >> Base de Datos >  >> RDS >> Mysql

Bloqueo de una fila de MySQL INNODB en 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 un tema complejo; niveles de bloqueo y transacción, pero la magia de arriba era el BEGIN declaración. Sin él, cada instrucción se ejecutaba en su propio nivel de transacción y FOR UPDATE la cerradura se estaba desbloqueando demasiado pronto.