Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Bloqueando uma linha MySQL INNODB em 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();

É uma questão complexa; níveis de bloqueio e transação, mas a mágica acima foi o BEGIN declaração. Sem ele, cada instrução estava sendo executada em seu próprio nível de transação e o FOR UPDATE bloqueio estava sendo desbloqueado muito cedo.