Transactions 学说中的嵌套集回滚

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

我正在将一些内容导入到嵌套的树模型中,并且我正在实现一个事务,以确保每个对象都已保存;如果没有,请将其从树上移除。我用的是第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”位置将有空格。那棵树就会被腐蚀;修复一棵有数千个结果的树可能非常昂贵

如何回滚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();
  }