我正在进行一个在线文件管理项目。我们在数据库(SQL Server)上存储引用,而将文件数据存储在文件系统中。我们在上传文件时以及删除文件时遇到了文件系统和数据库之间协调的问题。首先,我们需要在数据库中创建引用或在文件系统上存储文件。问题是,如果我们首先在数据库中创建引用,然后再在文件系统上存储文件,在存储文件时发生任何类型的错误,则会在数据库中创建该文件的引用,但没有文件数据存储在文件系统中。请给我一些解决这种情况的方案。我非常需要它;原因是什么?
File Exists DB Entry Exists Action
Yes Yes No action, normal state
No Yes Error -- missing file, "should never happen"
No No No action, normal state
Yes No Delete the file, but no error.
在上传文件时,存在一个灰色地带——即上传了文件但尚未被数据库确认。
解决这个问题的方法是需要将文件上传到临时目录中,以便进行分阶段上传。
实现这个方法的简单方式是将文件上传到不同的目录,但在相同的物理文件系统上,或者使用临时文件名将其上传到最终位置。无论哪种方式,文件都可以通过其名称或位置轻松地识别为“正在处理”。
你希望在同一文件系统上对这个文件进行“分阶段”处理有两个原因。一是磁盘空间。如果在上传时磁盘没有填满,那么你就知道它将适合于最终的存放位置(它已经“预留”了空间)。二是当你最终放置文件时,该操作必须是原子性的。在现代文件系统上,同一文件系统上的文件重命名操作是原子性的。基本上,你不能让文件“半路重命名”,即使它必然“覆盖”了一个现有文件(原始文件也会在重命名操作期间被删除)。
一旦进行了分阶段处理,你的操作就变成了:
Start DB transaction
Rename file
Add DB record
Commit transaction
Start DB Transaction
Delete DB record
Commit transaction
Delete file from file system