【发布时间】:2010-07-07 18:53:31
【问题描述】:
我正在尝试编写一个函数来从我的数据库中的表中选择最近提取的值。我通过选择一行然后立即更改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,但没有成功。
关于为什么这不起作用的任何想法?或者有没有更好的方法来做到这一点?
编辑:我开始认为这可能与 Magento 肯定使用的 PDO 驱动程序有关。我认为 phpMyAdmin 正在使用 mysqli,但我无法确认。
【问题讨论】:
标签: mysql zend-framework model magento locking