0

我需要执行以下操作

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

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

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

4

1 回答 1

2

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

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

为此,(a)您的网络服务器必须在提供文件之前引用数据库,或者(b)在文件删除失败后有一段无限期必须是可以的,在此期间它仍然可以被提供. 当然还有一个“自然竞争条件”,即在删除尝试之前开始提供服务的文件,即使在事务完成后也会完成下载。

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

于 2013-09-02T22:33:30.530 回答