【问题标题】:Transaction safe insertion of node in nested set?嵌套集中节点的事务安全插入?
【发布时间】:2010-06-28 06:00:41
【问题描述】:

我在 mysql 中以嵌套集的形式存储分层数据。

myTable
  id,
  title,
  lft,
  rgt

我使用以下一系列sql语句插入一个新节点:

SELECT @myLeft := lft FROM myTable WHERE ID = $id;  
UPDATE myTable SET rgt = rgt + 2 WHERE rgt > @myLeft;       
UPDATE myTable SET lft = lft + 2 WHERE lft > @myLeft;       
INSERT INTO myTable(title, lft, rgt) VALUES($title, @myLeft + 1, @myLeft + 2);

这可行,但如果同时添加(接近)大量节点,则可能会出现问题。

我想知道,确保没有数据损坏的最佳方法是什么(存储过程不是一个选项)。只需将此 sql 包含在事务中就足够了吗?我应该使用事务和表锁定吗?

谢谢

【问题讨论】:

    标签: mysql transactions hierarchical-data nested-sets


    【解决方案1】:

    如果您使用的是 MyISAM 表,则必须锁定该表,因为 MyISAM 表不支持事务。

    对于 InnoDB 表,您可以在事务中完成所有工作。

    BEGIN; -- or whatever API your framework has for starting a transaction
    SELECT @myLeft := lft FROM myTable WHERE ID = $id FOR UPDATE;  
    UPDATE myTable SET rgt = rgt + 2 WHERE rgt > @myLeft;       
    UPDATE myTable SET lft = lft + 2 WHERE lft > @myLeft;       
    INSERT INTO myTable(title, lft, rgt) VALUES($title, @myLeft + 1, @myLeft + 2);
    COMMIT; -- or whatever API your framework has for commiting a transaction
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多