【问题标题】:Duplicate entry on INSERT after DELETE from table in transaction从事务中的表中删除后插入的重复条目
【发布时间】:2013-03-27 16:08:56
【问题描述】:

我正在寻找任何想法来解释(和防止)以下情况:

1) 我们有一个 Magento 重新索引过程(价格或股票)不时失败:

异常“Zend_Db_Statement_Exception”和消息“SQLSTATE[23000]: 完整性约束违规:1062 重复条目“512723-1-1” /[省略]/lib/Zend/Db/Statement/Pdo.php:242中的键'PRIMARY''

完整跟踪:https://gist.github.com/werdan/5255362

2) Magento reindex 是在事务中完成的,大致如下:

START TRANSACTION;
DELETE FROM `cataloginventory_stock_status`;
INSERT INTO cataloginventory_stock_status SELECT * FROM cataloginventory_stock_status_idx;
COMMIT;

3) 在 DELETE 和 INSERT 命令之间破坏表的一致性应该是不可能的,但它确实发生了。

我们检查了表 cataloginventory_stock_status 和 cataloginventory_stock_status_idx 具有相同的键和结构。

还有什么可以作为解释和解决方案的建议?

【问题讨论】:

  • 事务是一种能够回滚更改的工具。它们不会阻止其他进程读取或写入表。

标签: mysql magento transactions


【解决方案1】:

这是许多 SQL 转储工具所做的:

LOCK TABLES foo WRITE;
ALTER TABLE foo DISABLE KEYS;

INSERT INTO foo (foo_id, foo_name) VALUES (1, 'One'), 
    (2, 'Two'), 
    (3, 'Three');

ALTER TABLE foo ENABLE KEYS;
UNLOCK TABLES;

【讨论】:

  • 谢谢,但不幸的是,locks on tables are not transaction-safe 它是 Magento 中众所周知且广泛使用的一段代码,所以我认为这不是一条路要走,至少对于我。
  • 请仔细阅读您链接的文档,它解释了确切的限制。只有两种方法可以避免竞争条件:锁定表或完全关闭站点。你选择;-)
猜你喜欢
  • 2021-07-07
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2021-01-12
相关资源
最近更新 更多