在python中以原子方式/事务方式删除文件

时间:2013-09-02 21:41:37

标签: python django transactions

我需要做以下

  • 从数据库中删除许多实体,这些实体也有一个与之关联的文件保存到文件系统中,也可以由Web服务器访问(图像!)。

问题:文件删除可能会失败,我在主实体的文件夹中有所有文件(它实际上是1-N关系,是N个文件所有者中的每一个)。如果我在Web服务器访问它时尝试删除文件,我将得到一个异常,该过程将减半,一些图像被删除,一些不存在,使系统不一致。

有没有办法在文件系统中执行类似于事务的操作(删除所有文件或不删除任何文件)?或者也许是另一种方法(最糟糕的计划是将文件保存在数据库中,但这很糟糕)

1 个答案:

答案 0 :(得分:2)

没有办法在正常的文件系统上以事务方式删除多个文件(你可能能够找到它所在的深奥文件系统,但即便如此,我怀疑它会对你有所帮助。显然你当前的文件系统甚至不允许你删除一个正在阅读的文件,所以大概你会被你所拥有的东西所困扰!)。

也许您可以在数据库中保存文件内容,但文件系统中哪些文件名“确实存在”。有关任何需要一致性的内容,请参阅该列表。如果文件删除失败,您可以将文件标记为“不存在”,并且要求将来尝试删除,然后在任何看似合理的情况下重试(可能是偶尔的维护工作,也许是辅助进程以指数退避重试每个失败的极限)。

要使其工作,要么(a)您的网络服务器必须在提供文件之前引用数据库,否则(b)在文件无法删除之后无限期可能无效,在此期间它可能尽管如此。当然,还有“自然竞争条件”,即在删除尝试之前开始提供的文件,即使在交易完成后也将完成下载。

[编辑:啊,我刚刚想到“我拥有主要实体的文件夹中的所有文件”可能真的很有帮助。在您的事务中,重命名该目录。原子地“删除”所有文件,至少从它们的旧名称中删除它,并且如果正在使用任何文件,它将失败(在禁止那种事情的文件系统上)。如果重命名成功,并且没有其他人知道新名称,那么他们将无法访问这些文件,而您应该能够毫无困难地删除它们。我认为。当然,如果您遇到无法删除文件的其他原因,这不起作用,因为您可能能够重命名该文件夹但无法删除该文件。]