mysql - 嵌套集中节点的事务安全插入?

标签 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 包含在事务中就足够了吗?我应该使用事务和表锁定吗?

谢谢

最佳答案

如果您使用的是 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

关于mysql - 嵌套集中节点的事务安全插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3128794/

相关文章:

mysql - 如何优化搜索SQL查询?

java - 当一个数据源事务失败时,Spring 无法回滚已提交的事务

mysql - 快速重定向错误 : can't set headers after they are sent using NodeJS and MySQL

Mysql - 索引性能

php - 如何在不使用分页的情况下返回到相同的 MySql 记录

Django:从事务角度看 save() 和 create() 的区别

java - Spring 中的事务原子性

symfony2 邻接列表模型与 Forms 一起使用

sql - 使用sql查询显示团队名称和父名称

kendo-ui - Kendo UI Treeview 给出错误 "Uncaught TypeError: Object [ has no method ' 级别'"