Mysql
 sql >> Base de données >  >> RDS >> Mysql

Verrouiller une ligne 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();

C'est une question complexe; niveaux de verrouillage et de transaction, mais la magie ci-dessus était le BEGIN déclaration. Sans cela, chaque instruction s'exécutait dans son propre niveau de transaction, et le FOR UPDATE le verrou a été déverrouillé trop tôt.