Magento: пользовательский запрос MySQL с блокировками не работает - PullRequest
1 голос
/ 07 июля 2010

Я пытаюсь написать функцию, чтобы ВЫБРАТЬ наименее недавно выбранное значение из таблицы в моей базе данных. Я делаю это, выбирая строку, а затем сразу же изменяя поле last_used.

Поскольку это связано с SELECT и UPDATE, я пытаюсь сделать это с помощью блокировок. Блокировки должны гарантировать, что одновременное выполнение этого запроса не будет работать в одной строке.

Запрос отлично работает в phpMyAdmin, но не работает в Magento. Я получаю следующую ошибку:

SQLSTATE[HY000]: General error

Ошибка возникает здесь:

#0 /var/www/virtual/magentodev.com/htdocs/lib/Varien/Db/Adapter/Pdo/Mysql.php(249): PDOStatement->fetch(2)

Вот код моей модели, включая SQL-запрос:

$write = Mage::getSingleton('core/resource')->getConnection('core_write');

$sql = "LOCK TABLES mytable AS mytable_write WRITE, mytable AS mytable_read READ;
        SELECT @val := unique_field_to_grab FROM mytable AS mytable_read ORDER BY last_used ASC LIMIT 1;        
        UPDATE mytable AS mytable_write SET last_used = unix_timestamp() WHERE unique_field_to_grab = @val LIMIT 1;
        UNLOCK TABLES;
        SELECT @val AS val;";

$result = $write->raw_fetchrow($sql, 'val');

Я также пытался использовать raw_query и query вместо raw_fetchrow, но безуспешно.

Есть мысли о том, почему это не работает? Или есть лучший способ сделать это?

EDIT : Я начинаю думать, что это может быть связано с драйвером PDO, который Magento определенно использует. Я думаю, что phpMyAdmin использует mysqli, но я не могу это подтвердить.

1 Ответ

2 голосов
/ 08 июля 2010

Вероятно, функция, которую использует Magento, не поддерживает несколько SQL-операторов.Вызовите каждый оператор отдельно.

exec("LOCK TABLES mytable AS mytable_write WRITE, mytable AS mytable_read READ");
exec("SELECT @val := unique_field_to_grab FROM mytable AS mytable_read ORDER BY last_used ASC LIMIT 1");
exec("UPDATE mytable AS mytable_write SET last_used = unix_timestamp() WHERE unique_field_to_grab = @val LIMIT 1");
exec("UNLOCK TABLES");
exec("SELECT @val AS val");

Используйте соответствующие функции вместо exec ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...