如何在文件系统和数据库之间实现协调?

时间:2010-03-26 16:28:27

标签: database transactions filesystems software-quality

我正在开发一个在线文件管理项目。我们在数据库(sql server)上存储引用,并在文件系统上存储文件数据。

我们正在上传文件时以及删除文件时遇到文件系统和数据库之间协调的问题。首先,我们在数据库中创建引用或在文件系统上存储文件。

问题是,如果我先在数据库中创建一个引用然后将文件存储在文件系统上,但是在文件系统上存储文件时会发生任何类型的错误,那么就会在数据库中创建该文件的引用但文件系统上不存在文件数据。

请给我一些解决方案如何处理这种情况。我非常需要它。

我们删除文件时会发生这种情况吗?

4 个答案:

答案 0 :(得分:6)

访问文件系统确实不是事务性的。您需要自己模拟全有或全无分布式事务:如果数据库中的提交失败,请删除文件系统上的文件。反过来说,如果写入文件失败,回滚数据库事务(这将会有点复杂,但这是一个粗略的草图)。

请注意,更新文件时会非常复杂。您需要先复制它,以便在覆盖文件后数据库事务失败时仍可以恢复该文件的旧版本。是否要执行此操作取决于所需的健壮性级别。

尝试强制所有操作都通过您的应用程序(创建,编写,删除文件)。如果你不能这样做,你不能阻止文件直接在文件系统上访问(也许可能被删除),除了周期性地将数据库与文件系统同步之外别无他法:检查哪个文件被删除并删除数据库中的条目。您可以创建一个运行每个 X 分钟的作业。

我还建议在数据库中存储文件的哈希(例如MD5)。花一点时间来计算它,但这对我来说非常有用,可以用来检测问题,例如:如果文件在文件系统上被错误重命名但在数据库中没有重命名。这也允许定期运行一些完整性检查,以验证没有任何问题被搞砸。

如果这种方法还不够(例如,你希望它更健壮),我认为除了将二进制文件存储在LOB中的数据库之外别无他法。那么它将是真正的交易和安全。

答案 1 :(得分:1)

我知道一个老问题,但为了其他读者的利益:

根据您的操作系统,您可以使用Transactional TxF

http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

答案 2 :(得分:0)

将两个事件(管理引用和管理文件)视为单个事务。如果其中任何一个失败,则将另一个失败。然后你会发现很难进入两者不同步的情况。回滚数据库操作比文件系统操作更容易。

答案 3 :(得分:0)

SQL Server 2008中引入了

FILESTREAM来解决这个问题。

但是,它有自己的implementation challenges