Transactions 学说中的嵌套集回滚
我正在将一些内容导入到嵌套的树模型中,并且我正在实现一个事务,以确保每个对象都已保存;如果没有,请将其从树上移除。我用的是第1.1.6条Transactions 学说中的嵌套集回滚,transactions,doctrine,nested,Transactions,Doctrine,Nested,我正在将一些内容导入到嵌套的树模型中,并且我正在实现一个事务,以确保每个对象都已保存;如果没有,请将其从树上移除。我用的是第1.1.6条 // Start the transaction $conn = Doctrine_Manager::connection(); try { $conn->beginTransaction(); // add it as a child of the suburb $object->getNode()->insertAsLast
// Start the transaction
$conn = Doctrine_Manager::connection();
try {
$conn->beginTransaction();
// add it as a child of the suburb
$object->getNode()->insertAsLastChildOf($parent);
...
// save related objects
...
$conn->commit();
} catch(Doctrine_Exception $e) {
$conn->rollback();
}
现在发生的是,如果事务块中有任何错误,所有对象都将被删除。但是,树不会返回到原始位置。这意味着,在“lft”和“rgt”位置将有空格。那棵树就会被腐蚀;修复一棵有数千个结果的树可能非常昂贵
如何回滚InsertAslatChildof()。我认为这是教义本身应该做的事情,但我希望有人能给我一个提示
谢谢 当插入失败时,我必须手动回滚树,这是我使用的代码:
try {
$conn->beginTransaction();
// add it as a child of the suburb
$obj->getNode()->insertAsLastChildOf($parent);
$rgt = $obj->rgt;
...
...
}catch(Doctrine_Exception $e) {
$conn->rollback();
$result = Doctrine_Query::create()->update('Model p')
->set('p.lft = p.lft - 2')
->set('p.rgt = p.rgt - 2')
->where('p.rgt > ?', $rgt)
->addWhere('p.root_id = ?', $parent->root_id)
->execute();
}
7年后,有人(我)也有类似的问题。我从中找到了答案。您只需将$conn->beginTransaction()放入代码>在<代码>尝试之前
,条令将回滚所有内容:
// $em instanceof EntityManager
$em->getConnection()->beginTransaction(); // suspend auto-commit
try {
$object->getNode()->insertAsLastChildOf($parent);
$em->flush();
$em->getConnection()->commit();
} catch(Doctrine_Exception $e) {
$em->getConnection()->rollBack();
}