MySQL更新不更新所有记录

标签 mysql transactions commit

我有一个列出所有订单的数据库表。每个周末都会运行一个 cron 并为每个客户生成发票。代码遍历每个客户,获取他们最近的订单,创建一个 PDF,然后更新订单表以记录每个订单的发票 ID。

最后的更新查询是:

更新预订集 invoiceed='12345' where username='test-username' and invoiced='';

因此,为 test-username 之前未开具发票的所有订单将开具发票设置为 12345。

我遇到了一个问题,订单被添加到 PDF 但没有更新以反射(reflect)它们已开具发票的事实。

我已经开始手动运行更新查询并遇到了一个奇怪的场景。

一个客户可能有 60 个订单。

如果我运行一次查询,则更新 1 个订单。我再次运行它并更新了 1 个订单,我重复该过程并且每次只更新少量订单 - 在 1 到 3 之间。它不会像我期望的那样在一个查询中更新 60 个。我需要重复运行查询,直到它最终返回“受影响的 0 行”,然后我可以确定所有行都已更新。

我的查询中没有包含 LIMIT XX,所以我没有理由不能一次更新所有订单。我重复运行的查询每次都是相同的。

有没有人有什么明智的建议?!

最佳答案

我猜您正在使用 InnoDB。您尚未透露正在运行的代码类型。

但我敢打赌您看到的是与交易相关的问题。当程序与交互式 session 的工作方式不同时,通常是事务问题。

参见此处:http://dev.mysql.com/doc/refman/5.5/en/commit.html

如果您在 UPDATE 语句之后立即发出 COMMIT; 命令,事情会更好吗?

请注意,您的语言绑定(bind)可能有其自己的首选方式来发出 COMMIT; 命令。

处理这个问题的另一种方法是发出 SQL 命令

 SET autocommit = 1

在您建立连接之后。这将使每个更改数据的 SQL 命令自动执行其 COMMIT 操作。

关于MySQL更新不更新所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15503905/

相关文章:

java - Spring JMS 监听器中的事务管理

java - EJB3.1 - 同一 JVM 中多个应用程序的事务

svn - 如何编辑 Subversion 中已提交的日志消息?

Git 与 squash merge 但保留网络图

php - 为什么我的登录脚本将我发送到空白页面?错误报告于

javascript - 内爆 :Invalid arguments in an array?

php - 带 OR 条件的 MySQL WHERE

mysql查询计数主表中第二表中具有多个属性的记录数

mysql - 想要在以下程序中应用交易,但它不起作用

git - 如何在不 merge 的情况下将提交从一个分支复制到另一个分支?