Я прочитал, что транзакции являются атомарными в MySQL (InnoDB), но когда я тестирую следующий код в 5 потоках, они выбирают один и тот же идентификатор:
$db->beginTransaction();
$row = $db->fetchRow("SELECT * FROM atomic WHERE selected = 0 LIMIT 1");
sleep(5);
$db->update("atomic", array('selected' => 1), "id = " . $row['id']);
$db->commit();
echo "Selected row: " . $row['id'];