我有一个列出所有订单的数据库表。每个周末都会运行一个cron,它会为每个客户生成发票。代码循环遍历每个客户,获取他们最近的订单,创建PDF然后更新订单表以记录每个订单的发票ID。
最终更新查询是:
更新预订已设置invoiced ='12345',其中username ='test-username'和invoiced ='';
因此,对于以前未开具发票的test-username的所有订单,请将发票设置为12345。
我遇到了一个问题,即订单被添加到PDF但未更新以反映它们已开具发票的事实。
我已经开始手动运行更新查询并遇到一个奇怪的情况。
客户可能有60个订单。
如果我运行查询一次,则更新1个订单。我再次运行它并更新了1个订单,我重复这个过程,每次只更新少量订单 - 介于1和3之间。它不像我期望的那样在一个查询中更新60。我需要反复运行查询,直到它最终返回“0行受影响”,然后我可以确定所有行都已更新。
我的查询中没有包含LIMIT XX,因此我没有理由不能立即更新所有订单。我每次重复运行的查询都是相同的。
有人有任何明智的建议吗?!
答案 0 :(得分:3)
我猜你正在使用InnoDB。您尚未透露正在运行的代码类型。
但我打赌你看到的是与交易有关的问题。当程序与交互式会话的工作方式不同时,通常会出现交易问题。
见这里:http://dev.mysql.com/doc/refman/5.5/en/commit.html
如果您在COMMIT;
声明后立即发出UPDATE
命令,情况会更好吗?
请注意,您的语言绑定可能有自己的首选方式发出COMMIT;
命令。
处理此问题的另一种方法是发出SQL命令
SET autocommit = 1
建立连接后立即。这将使每个更改数据的SQL命令自动执行COMMIT操作。