I have read this:
Transaction safe insertion of node in nested set?
but I worried about locking of inserting new node in nested set model.
I want insert a new node in my tree categories but I want sure that new node it is inserted without corruption. Engine used in mysql is InnoDb.
As other question say:
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
My problem is if concurrent users try to insert new node in same tree, does a transaction is sufficient for update and adjust left and right of others node?
If user1 add new node (execute in transaction1) and at the same time user2 add new node (execute in transaction2), I’m sure that user2 read updated tree with node added by user1 before user2 insert his new node?
So,100 users insert new node in same times last users must wait as long as previews users finish for have always a consistency tree?
InnoDB does row level locking. Thus rows being updated will be locked for the duration of the transaction. This can lead to blocking and deadlocking.
If a row is being updated InnoDB will not be able to acquire a lock on the row to update it again. This effectively serializes the transactions. Note that the transaction isolation level can be controlled see this link http://dev.mysql.com/doc/refman/5.1/en/dynindex-isolevel.html
Also here is a interesting article on how to look for deadlock in a innodb engine http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks/.
If the nested sets are being updated heavily making sure you have the right isolation level and wrapping your statement in transaction will be sufficient. However it might create locking, blocking and deadlocking issues that you would need to code for.