【问题标题】:Magento: Custom MySQL query with locks not workingMagento:带有锁的自定义 MySQL 查询不起作用
【发布时间】: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


    【解决方案1】:

    可能 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()。

    【讨论】:

    • 成功了,谢谢你的建议!!你为我节省了无数小时的进一步调试 lol
    猜你喜欢
    • 1970-01-01
    • 2021-08-28
    • 2020-11-26
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多