由于某种原因,订单ID(sales_flat_order表上的increment_id)随后在我的Magento 1.6.1上没有递增。这就是它如何管理大量现场订单:
increment_id created_at updated_at
100000001 2011-12-14 12:35:24 2011-12-14 12:35:25
100000002 2011-12-14 13:02:39 2011-12-14 13:02:39
100000003 2011-12-14 13:04:18 2011-12-14 13:04:18
100000004 2012-02-01 16:54:58 2012-02-01 16:54:58
100000005 2012-03-14 12:22:35 2012-03-14 12:22:35
100000006 2012-03-20 13:10:48 2012-03-20 13:10:48
100000011 2012-03-29 20:58:48 2012-03-29 20:58:48
100000012 2012-03-29 21:06:43 2012-03-29 21:06:43
100000013 2012-03-30 10:48:20 2012-03-30 10:48:21
100000014 2012-03-30 13:05:40 2012-03-30 13:05:41
100000015 2012-04-03 15:51:01 2012-04-03 15:51:02
100000016 2012-04-19 15:00:49 2012-04-19 15:00:50
100000017 2012-05-09 12:09:21 2012-05-09 12:09:22
100000019 2012-05-24 05:35:35 2012-05-24 05:35:36
100000020 2012-05-24 05:41:11 2012-05-24 05:41:12
100000008 2012-05-24 05:48:52 2012-05-24 05:48:53
我的问题是为什么Magento有时会跳跃增量?更糟糕的是,在我的示例顺序中,增量100000008在100000020之后。是否有人知道为什么会发生这种情况并且是否有办法解决它?
答案 0 :(得分:23)
这是正常的,虽然可以理解为令人不安。
当Magento进入结账流程时,它会“保留”increment_id并将其放在quote(cart)对象上。您可以在以下位置查看获取增量ID的代码:
Mage_Eav_Model_Entity_Type::fetchNewIncrementId()
每个商店的最后使用的ID存储在eav_entity_store中。如果客户在完成结账流程之前放弃了他们的购物车(即报价对象),则保留的increment_id将永远不会显示在订单上。您可以在繁忙的商店中看到订单号中的这种效果 - 偶尔会有一个非常旧的订单ID来自正在检查旧购物车的客户当天的订单。
此行为的存在是为了允许Magento在订单完成之前发送支付网关最终订单ID(increment_id),允许网关将订单ID与订单相关联。如果客户放弃了网关中的付款流程,则订单ID已经死亡(或者更正确地附加到报价单上)。
您可以在PayPal快递模块中看到这种情况:
Mage_Paypal_Model_Express_Checkout::start()
调用
Mage_Sales_Model_Quote::reserveOrderId()
如果您想找到'缺失'的increment_id,请查看字段reserved_order_id下的sales_flat_quote。您应该看到它们附加到未转换的引用对象(购物车)。
此行为可能会导致某些支付网关出现问题;想起了Moneris。当您向Moneris的托管付款页发送两次相同的订单ID时,它会扼杀并为客户创建一个神秘的错误状态。当客户访问托管付费页面,退出并重新访问该页面时,会出现这种情况。因此,在某些情况下,有必要以编程方式重新生成与引用对象关联的订单ID。
答案 1 :(得分:1)
我遇到了同样的问题,但只有当服务器受到大量负载时才会遇到问题。出现此问题的原因是db在将报表转换为订单时进入锁定状态。在进一步检查时,我发现问题是它在插入sales_flat_order表后尝试在事务中写入sales_flat_order_grid表。使用并发查询会导致锁定冲突。真正的解决方案是将sales_flat_order_grid的东西移出事务。
The link helped me understand the issue
补丁为我解决了这个问题。
您必须从Mage_Sales_Model_Abstract中删除函数_afterSave并添加
public function afterCommitCallback(){
if (!$this->getForceUpdateGridRecords()) {
$this->_getResource()->updateGridRecords($this->getId());
}
parent::afterCommitCallback();
}
如果它能为您解决问题,请告诉我。
答案 2 :(得分:-1)
在过去的几个月中,我们多次遇到相同的问题。查看付款服务提供商的交易清单后,我们发现有1000笔低价值(微)交易由于潜在的欺诈问题而被拒绝。我的观点是,欺诈者正在尝试使用我们的结帐流程来探查他们必须找出哪些卡有效以及哪些卡已死的卡列表。我已将其举报为欺诈行为,我们的网络托管商和我们的付款提供商。
总而言之,我的建议是让您检查同一时间段的PSP交易清单。
祝你好运, 简直。