Doctrine 1.2:使用postDelete删除文件系统上的相关文件 - 具有事务支持

时间:2010-11-01 14:49:21

标签: transactions doctrine doctrine-1.2

这个问题是对这个问题的一种延伸:

Perform some cleanup when deleting a record in Symfony/Doctrine

我正在做这个并且它工作正常,除了一个问题:如果删除失败并且事务从未提交,则postDelete方法仍然运行并且文件也会被删除。

什么是避免这种情况的好方法?

1 个答案:

答案 0 :(得分:3)

如果只在事务实际提交时需要触发某些内容,则需要在postDelete中对其进行排队,然后在postTransactionCommit处理程序中执行

$conn = Doctrine_Manager::connection(...);
$conn->addListener(new TransactionCommitListener());

class TransactionCommitListener extends Doctrine_EventListener {

  public function postTransactionCommit(Doctrine_Event $event) {
    if ($event->getInvoker()->getConnection()->getTransactionLevel() == 1) {
      // do your filesystem deletes here
    }
  }

  public function postTransactionRollback(Doctrine_Event $event) {
    // clear your delete queue here
  }
}

我通常使用单例来存储队列并静态获取它。如果您使用多个连接,则需要有多个队列。

上面的提交处理程序只触发最外面的提交,这是Doctrine与mysql一起工作的方式,因为它不提供嵌套的事务。如果您的数据库提供嵌套事务,并且doctrine支持该事务,则可能需要更改它。