我正在将一些内容导入嵌套树模型,我正在实现一个事务,以确保每个对象都已保存;如果没有,请将其从树中删除。我正在使用Doctrine 1.1.6。
// 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'位置有空格。那棵树会被破坏;并且用数千个结果修复一棵树可能非常昂贵。
如何回滚insertAsLastChildOf()。我认为这是教义本身应该做的事情,但我希望有人可以给我一个提示。
谢谢!
答案 0 :(得分:1)
当插入失败时,我不得不手动回滚树,这是我用过的代码:
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();
}
答案 1 :(得分:0)
$conn->beginTransaction();
之前放置try
,而Doctrine将回滚所有内容:
// $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();
}