Napisałem klasę obsługującą drzewka NS. W praktyce wszystko działa fantastycznie ale mam dylemat bo w teorii coś zawsze się może popsuć. Dla przykładu kod zamieniający ze sobą dwie sąsiednie gałęzie drzewa:
<?php
public function moveNodeRight($id)
{
if ($currentNode = $this->_getNode($id)) {
$query = "SELECT $this->dbTableColumns FROM (.[*1].) IMIT 1";
$this->dbDriver->query($query);
$nextNode = $this->dbDriver->fetchRow();
if ($nextNode) {
$currentNodeElements = ($currentNode->right - $currentNode->left +1) / 2;
$restNodesElements = ($nextNode->right - $currentNode->right) / 2;
$this->dbDriver->query("UPDATE `$this->dbTable` SET `(.[*2].)` cluster");
$this->dbDriver->query("UPDATE `$this->dbTable` SET `(.[*3].) cluster");
$this->dbDriver->query("UPDATE `$this->dbTable` SET (.[*4].) `left` < 0");
}
}
}
[*1] "SELECT $this->dbTableColumns FROM `$this->dbTable` WHERE `parentId` = $currentNode->parentId
AND `parentId` <> 0 AND `left` = $currentNode->right + 1 LIMIT 1"
[*2] "UPDATE `$this->dbTable` SET `left` = (-1)*(`left` + ($restNodesElements*2)),
`right` = (-1)*(`right` + ($restNodesElements*2)) WHERE `left` >= $currentNode->left
AND `left` < $currentNode->right AND `cluster` = $currentNode->cluster"
[*3] "UPDATE `$this->dbTable` SET `left` = (`left` - ($currentNodeElements*2)),
`right` = (`right` - ($currentNodeElements*2)) WHERE `left` > $currentNode->right
AND `left` < $nextNode->right AND `cluster` = $currentNode->cluster"
[*4] "UPDATE `$this->dbTable` SET `left` = (-1)*(`left`), `right` = (-1)*(`right`) WHERE `left` < 0"
?>
Sam kod nie jest moze aż tak ważny. Istotne jest że są tam 3 "UPDEJTY" które muszą się wykonać zawsze w całości oraz żadne inne zapytanie typu UPDATE nie może się wykonać na tej tabeli pomiędzy tymi zapytaniami.
Próbowałem kilku sposobów ale chciałbym się poradzić kogoś z większym doświadczeniem bo nigdy wcześniej nie korzystałem z lock tables ani transakcji. W jaki sposób powinienem je w tym wypadku zastosować ? Moze dla nested sets tree są jakieś utarte szlaki?