我正在开发一个在线文件管理项目.我们在数据库(sql server)上存储引用,并在文件系统上存储文件数据.
当我们上传文件时以及删除文件时,我们正面临文件系统和数据库之间的协调问题.首先,我们在数据库中创建引用或在文件系统上存储文件.
问题是,如果我先在数据库中创建一个引用然后将文件存储在文件系统上,但是在文件系统上存储文件时会发生任何类型的错误,那么该文件的引用是在数据库中创建的但没有文件数据存在于文件系统中.
请给我一些解决方案如何处理这种情况.我非常需要它.
解决方法
访问文件系统确实不是事务性的.您需要自己模拟一个全有或全无的分布式事务:如果数据库中的提交失败,请删除文件系统上的文件.相反,如果写入文件失败,则回滚数据库事务(这将会更复杂,但这是一个粗略的草图).
请注意,更新文件时可能会非常复杂.您首先需要复制它,以便在您覆盖文件后数据库事务失败时仍可以恢复该文件的旧版本.是否要执行此操作取决于所需的稳健性级别.
尝试强制所有操作都通过您的应用程序(创建,写入,删除文件).如果你不能这样做,你不能阻止文件直接在文件系统上访问(并可能被删除),除了周期性地将数据库与文件系统同步之外,我没有别的办法:检查哪个文件被删除和删除数据库中的条目.您可以创建一个每X分钟运行一次的作业.
我还建议在数据库中存储文件的哈希值(例如MD5).花一点时间来计算它,但这对我来说非常有用,可以检测到问题,例如:如果文件在文件系统上被错误重命名但在数据库中没有重命名.这也允许定期运行一些完整性检查,以验证没有任何问题被搞砸.
如果这种方法还不够(例如,你希望它更强大),我认为除了将二进制文件存储在LOB中的数据库之外别无他法.那么它将是真正的交易和安全.