【发布时间】:2013-12-18 13:26:28
【问题描述】:
我正在尝试使用 Laravel 3 执行 SELECT ... FOR UPDATE 查询:
SELECT * from projects where id = 1 FOR UPDATE;
UPDATE projects SET money = money + 10 where id = 1;
我已经尝试了好几个小时了:
DB::connection()->pdo->exec($query);
和
DB::query($query)
我也尝试在查询中添加START TRANSACTION; ... COMMIT;
我试图在两个不同的部分将SELECT 与UPDATE 分开,如下所示:
DB::query($select);
DB::query($update);
有时我会受到 0 行的影响,有时我会收到类似这样的错误:
SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
SQL: UPDATE `sessions` SET `last_activity` = ?, `data` = ? WHERE `id` = ?
我想锁定行以更新敏感数据,使用 Laravel 的数据库连接。
谢谢。
【问题讨论】:
-
当您收到错误“update
sessionsSET (...)”时,第一个查询是否正确执行? -
当您使用带有 SELECT 的 DB::query() 时,PDO 希望您在下一个查询之前耗尽缓冲区。所以使用 DB::query($select)->closeCursor() 或 DB::connection()->pdo->exec($select) 来避免 SQL 错误。
-
你能试试我下面的解决方案吗?我一直来检查它是否有效!
-
@colinm,仅供参考,您的评论只是您前一天可以阅读的答案的一部分。
标签: mysql laravel locking innodb laravel-3