2010-06-27 4 views
1

Je stocke des données hiérarchiques dans mysql sous la forme d'un ensemble imbriqué.Insertion d'un nœud dans un ensemble imbriqué en toute sécurité?

myTable 
    id, 
    title, 
    lft, 
    rgt 

J'utilise la série suivante des instructions SQL pour insérer un nouveau nœud:

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); 

Cela fonctionne, mais il y a potentiellement des problèmes si un grand nombre de nœuds sont ajoutés (près) en même temps.

Je me demande, quelle est la meilleure façon de garantir l'absence de corruption de données (les procédures stockées ne sont pas une option). Est-ce suffisant de simplement inclure ce sql dans une transaction? Dois-je utiliser des transactions et également le verrouillage de table?

Merci

Répondre

1

Si vous utilisez des tables MyISAM, vous devez verrouiller la table, comme les tables MyISAM ne supportent pas les transactions.

Pour les tables InnoDB, vous pouvez effectuer l'intégralité de votre travail dans une transaction.

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 
Questions connexes