2010-06-27 54 views
1

我以嵌套集的形式在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

如果你使用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