mysql - Magento:带锁的自定义 MySQL 查询不起作用

标签 mysql zend-framework model magento locking

我正在尝试编写一个函数来从我的数据库中的表中选择最近最少获取的值。我通过选择一行然后立即更改 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_queryquery 而不是 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/

相关文章:

php - MVC + Service Layer 在 zend 或 PHP 中常见吗?

ruby-on-rails - ruby on rails 常量化方法

c# - 在 C#.Net 中使可能包含 utf-8 字符的字符串对于 MySQL 来说是安全的

mysql - 在 phpMyAdmin 中导入文本文件

email - Magento 主机名验证错误

php - 一个很好的 mvc 模型类,跟踪属性

cakephp - $_schema var in models 中的每个键在 CakePHP 中的作用是什么?

java - 加速多个 JDBC SQL 查询?

mysql - 在sql中使用内连接创建表

php - 使用 zend 1.12 在 mysql 中保存 xslt 表单