3

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

最后的更新查询是:

update bookings set invoiced='12345' where username='test-username' and invoiced='';

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

我遇到了一个问题,订单被添加到 PDF 中,但没有更新以反映它们已开票的事实。

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

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

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

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

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

4

1 回答 1

3

我猜你正在使用 InnoDB。您还没有透露您正在运行的代码类型。

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

见这里: http ://dev.mysql.com/doc/refman/5.5/en/commit.html

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

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

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

 SET autocommit = 1

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

于 2013-03-19T17:57:42.903 回答