在嵌套集中事务安全插入节点?

时间:2010-06-27 20:31:40

标签: mysql transactions hierarchical-data nested-sets

我以嵌套集的形式在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包含在事务中是否足够?我应该使用事务还是表锁定?

由于

1 个答案:

答案 0 :(得分: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