Transactions 原则1.2:使用postDelete删除文件系统上的相关文件——具有事务支持

Transactions 原则1.2:使用postDelete删除文件系统上的相关文件——具有事务支持,transactions,doctrine,doctrine-1.2,Transactions,Doctrine,Doctrine 1.2,这个问题是这个问题的一种延伸: 我正在这样做,它工作得很好,除了一个问题:如果删除失败并且事务从未提交,postDelete方法仍然运行,并且文件仍然被删除 避免这种情况的好方法是什么?如果您只需要在事务实际已提交时触发某些内容,则需要在postDelete中将其排队,然后在postTransactionCommit处理程序中执行 $conn = Doctrine_Manager::connection(...); $conn->addListener(new TransactionCo

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

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


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

如果您只需要在事务实际已提交时触发某些内容,则需要在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的,因为它不提供嵌套事务。如果您的数据库提供嵌套事务,并且条令支持,那么您可能需要更改它