我正在尝试编写一个函数来从我的数据库中的表中选择最近最少获取的值。我通过选择一行然后立即更改 last_used
字段来执行此操作。
因为这涉及到 SELECT 和 UPDATE,所以我尝试使用锁来实现。锁是为了确保此查询的并发执行不会对同一行进行操作。
查询在 phpMyAdmin 中运行良好,但在 Magento 中失败。我收到以下错误:
SQLSTATE[HY000]: 一般错误
这里出现错误:
#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
但没有成功。
关于为什么这不起作用的任何想法?还是有更好的方法来实现这一点?
编辑:我开始认为这可能与 PDO 驱动程序有关,Magento 肯定在使用它。我认为 phpMyAdmin 使用的是 mysqli,但我无法确认这一点。
最佳答案
可能是 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()。
关于mysql - Magento:带锁的自定义 MySQL 查询不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3197878/