如何处理数据库事务中的文件删除?

时间:2011-07-25 09:07:09

标签: .net database

我希望删除驻留在数据库中的文档。 Document有一些位于文件系统中的附件。业务逻辑首先删除数据库中的所有内容,然后删除文件。但是,此过程通常是较大事务的一部分,并且当回滚发生时,文档将被还原但没有附件。怎么解决这个问题?

我看到两个解决方案:

  1. 在交易结束时删除文件。在我们的框架中,我认为这不是合理的解决方案。
  2. 将文件存储在数据库中。这可行,但需要重写和重新测试。
  3. 也许我错过了一些更简单的解决方案。你能分享一下你对这个问题的看法吗? 感谢。

3 个答案:

答案 0 :(得分:4)

从Vista开始,NTFS提供真正的事务,支持提交和回滚。 Wikipedia概述及详情here

答案 1 :(得分:1)

除非你缺少硬盘空间,否则我不会删除任何东西 - 无论是在文件系统上还是在数据库中;我只是创建一个针对数据库记录的状态标志,并将“已删除”作为新状态。

这是假设文件系统上对象的唯一路径是通过应用程序 - 如果你有人浏览文件存储,这可能不起作用。

我更喜欢通过状态标志来管理对象删除 - 它可以防止您描述的分布式事务处理方式,但它还允许您跟踪业务域的历史记录,这有助于追踪错误。

答案 2 :(得分:0)

普通文件系统不是事务性资源。将文件存储在数据库中以获得事务支持。请阅读Helge Klein的回答。此功能显然最终已添加到Windows中。

如果你使用的是SQL2008,我认为可以使用FileStream功能来处理数据库中的文件,但仍然可以通过路径将它们作为文件访问。也许这是一个升级路径,不需要立即重写整个应用程序。