Database design 如何保证跨两个数据库(文件系统和RDBMS)的原子性?

Database design 如何保证跨两个数据库(文件系统和RDBMS)的原子性?,database-design,Database Design,我正在从事一个在线文件管理项目。在该项目中,我们在数据库(sql server)上存储引用,在文件系统上存储文件数据;。在上载文件时,我们面临文件系统和数据库之间的协调问题,并且在删除文件时,我们首先在数据库中创建引用或在文件系统中存储文件;;问题是,如果先在数据库中创建引用,然后在文件系统上存储文件时在file system.bur上存储文件,则会发生任何类型的错误。然后在数据库中创建该文件的引用,但在文件系统上没有文件数据;;请给我一些解决办法如何处理这种情况;;我非常需要它;; 原因是什么

我正在从事一个在线文件管理项目。在该项目中,我们在数据库(sql server)上存储引用,在文件系统上存储文件数据;。在上载文件时,我们面临文件系统和数据库之间的协调问题,并且在删除文件时,我们首先在数据库中创建引用或在文件系统中存储文件;;问题是,如果先在数据库中创建引用,然后在文件系统上存储文件时在file system.bur上存储文件,则会发生任何类型的错误。然后在数据库中创建该文件的引用,但在文件系统上没有文件数据;;请给我一些解决办法如何处理这种情况;;我非常需要它;;
原因是什么?

您需要一个既支持数据库事务又支持文件系统事务的事务协调器,这样才能工作


您没有指定数据库、编程语言或平台,因此我只能回答这些问题。

在Windows Vista、Windows Server 2008或更高版本的Windows操作系统中,您可以

使用此功能,如果要在.NET中编程,可以使用System.Transactions命名空间作为一个原子单元执行对文件系统的更新和对数据库的更新


我不知道其他操作系统上是否有事务性文件系统。这并不意味着它们不存在

这实际上比你想象的要容易一点

首先,你需要确定“真相的单一来源”

也就是说,文件系统或数据库在任何给定的时间点都是正确的,哪一个是正确的

这样做的原因是它使解决冲突变得更容易

您应该假设数据库是您的源,而文件系统是数据库的影子。这似乎与直觉相反,因为如果条目不在文件系统中,它怎么可能存在于数据库中。显然不能。但是,基本上,如果文件不在数据库中,那么无论如何“它不存在”。因此,文件系统反映数据库的状态,而不是相反

根据这些假设,您最终会得到这些冲突解决规则

对于任何给定文件:

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
如果重命名文件操作失败,则中止并回滚DB事务,从而删除条目。如果重命名成功,而数据库失败?然后是上面列出的状态4。重试上载,直到成功

要删除文件,请执行以下操作:

Start DB Transaction
Delete DB record
Commit transaction
Delete file from file system
如果数据库删除失败,则不删除该文件。如果DB删除成功,而文件删除失败,那么我们将返回状态#4

最后,您有一个reaper进程,它定期(每天、每周或任何时候)将DB与文件系统进行比较,删除数据库中不存在的任何文件。由于DB是“唯一的真相来源”,这两个商店最终将保持同步

如果有一个文件丢失,并且有一个DB记录,那么您就有“数据损坏”。不要那样做。这是一个bug,或者有人正在检查您的文件系统

上载过程的重试特性和删除过程的快速失败为您提供了一个伪两阶段提交过程,该过程易于检查是非,并易于纠正到正确的状态。

Duplicate: