1

我正在寻找一些关于如何在以下情况下最好地避免死锁的提示。我为我们的 Magento 网站设置了一个自定义表格,其中存储了有关订购商品的一些详细信息以及利润率是多少。我监听sales_order_invoice_save_after事件并根据发票中的信息将行插入表中。我还根据每个产品的actual_shipping_costs字段计算估计利润。由于这只是一个估计值,我们会定期导入包含订单号和我们为运送订单支付的实际成本的 CSV。我的代码抓取导入的数据,重新计算 CSV 中每个订单中商品的利润,并更新数据库表。我最初在sales_flat_order中添加了几列sales_flat_order_items表,并在其中存储所有内容,而不是拥有自己的自定义表。我们开始看到一些客户在结帐后出现了一些问题(尽管我们无法正式将它们归咎于我的代码),此外还有一些可配置产品的不可预见的问题,因此我转而使用自定义表格。这给了我所需的灵活性,并解决了可配置产品的问题。结帐后似乎也不会引起任何问题。

这很棒,直到我第一次尝试导入包含大约 3000 个订单号的 CSV 文件以及运费。我进行导入的方式有点贫民窟,但这是我能找到的最佳方式。在系统配置下我的扩展有一些设置,其中之一是文件导入字段。如果您选择该字段并选择一个 CSV 文件并单击配置页面上的“保存”,它会抓取该文件,对其进行解析,然后在我的自定义表中添加/更新必要的行。如果您认为这是问题的一部分,并且如果您对我应该做什么有建议,请告诉我(即我是否应该使用 Dataflow 类并为此创建高级配置文件?)。这需要大量的时间... 比我将数据添加到 sales_flat_order 和 sales_flat_order_items 表时花费的时间要长得多。这可能是由于额外的计算和定位任何子产品的父级......不确定为什么它更慢,但确实如此。在此导入运行期间,如果客户下订单,他们可能(并且可能会)收到 SQL 死锁错误。

我的问题(如果您仍在关注这一切)是如何最好地避免这种情况。对于新订单,它们只是插入到表中,而导入正在更新现有行。他们不应该发生冲突。我唯一能想到的是,在我插入新行的代码中,我确实尝试加载记录以确保它不在表中......这可能是它被锁定的原因吗?我无论如何都不是 SQL 专家,但我确实在网上找到了一些关于不同类型的锁和设置优先级的信息。这是否可以通过 Magento 或 Zend 框架实现,这会有所帮助吗?

很抱歉这个冗长的问题。我希望你能跟随它。如果您需要更多信息,我会尽力而为。发布代码很困难,因为它位于许多不同的文件中,但请告诉我您需要什么,我会尽我所能提供。

谢谢!

4

0 回答 0