0

我读过这个: 在嵌套集中事务安全插入节点?

但我担心在嵌套集模型中插入新节点的锁定。我想在我的树类别中插入一个新节点,但我想确保它插入的新节点没有损坏。mysql中使用的引擎是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

我的问题是,如果并发用户尝试在同一棵树中插入新节点,事务是否足以更新和调整其他节点的左右?如果 user1 添加新节点(在 transaction1 中执行)同时 user2 添加新节点(在 transaction2 中执行),我确定 user2 在 user2 插入他的新节点之前读取了 user1 添加的节点的更新树?那么,100 个用户在同一时间插入新节点,最后一个用户必须等待用户完成预览才能始终拥有一致性树?

4

1 回答 1

0

InnoDB 执行行级锁定。因此,正在更新的行将在事务期间被锁定。这可能导致阻塞和死锁。

如果一行正在更新,InnoDB 将无法获取该行的锁以再次更新它。这有效地序列化了事务。注意事务隔离级别可以控制看这个链接http://dev.mysql.com/doc/refman/5.1/en/dynindex-isolevel.html

这里还有一篇关于如何在 innodb 引擎中查找死锁的有趣文章http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks/

如果嵌套集正在大量更新,请确保您具有正确的隔离级别并将语句包装在事务中就足够了。但是,它可能会产生您需要编写代码的锁定、阻塞和死锁问题。

于 2012-05-07T13:35:55.553 回答