这个问题是对这个问题的一种扩展:
在 Symfony/Doctrine 中删除记录时执行一些清理
我正在这样做,它工作正常,除了一个问题:如果删除失败并且事务从未提交,则 postDelete 方法仍然运行并且文件无论如何都会被删除。
什么是避免这种情况的好方法?
这个问题是对这个问题的一种扩展:
在 Symfony/Doctrine 中删除记录时执行一些清理
我正在这样做,它工作正常,除了一个问题:如果删除失败并且事务从未提交,则 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 一起工作的方式,因为它不提供嵌套事务。如果您的数据库提供嵌套事务,并且学说支持它,您可能需要更改它。