2014-11-23 28 views
1

seems to be possible实现利用象预写日志,两阶段提交和阴影分页等是否可以在“正常文件系统”上进行事务处理?

事实上,必须已经可以正常的技术文件系统之上事务,因为事务数据库引擎像InnoDB可以部署在普通文件系统之上。还有像XADisk这样的库。

然而,Apache Commons Transaction状态:

......我们深信,主要宣传的功能,事务性文件访问不能可靠地实现。我们确信在普通文件系统之上不可能有这样的实现。 ...

为什么Apache Commons Transactions要求在普通文件系统上实现事务是不可能的?

是否不可能在正常文件系统上执行事务?

回答

0

这个答案是纯粹的猜测,但你可能会比较苹果和橘子。或者更准确地说,牛奶和乳制品。

当数据库使用文件系统时,它仅使用系统上的一小部分预定义文件(每个数据库)。这些包括数据文件和日志文件。 ACID兼容事务绝对必需的一项操作是强制写入永久内存(磁盘或静态RAM)的能力。而且,我认为大多数文件系统都提供这种功能。

通过这种机制,数据库可以维护数据库中对象的锁定以及控制对所有对象的访问。令人高兴的是,该数据库具有建立在文件系统之上的内存/页面管理层。 “数据库”本身是根据页面,表格和索引等文件编写的,而不是文件,目录和磁盘块。

更通用的事务系统还有其他挑战。例如,它需要原子动作来获得更多的东西。例如。如果你“以事务方式”删除10个文件,所有这些将不得不同时消失。我不认为“传统”文件系统具有这种能力。

在数据库世界中,等价物将删除10个表。那么,你基本上是在事务中没有表—的情况下创建系统表的新版本,而旧表正在被使用。然后你完全锁定系统表(防止读取和写入),等待它们可用。然后交换新的表格定义(即没有表格),解锁表格并清理数据。 (这是为了在这种情况下锁定机制的直观视图,而不是100%准确的描述。)

因此,请注意,锁定和事务深深嵌入数据库正在执行的操作中。我怀疑这个模块的作者已经意识到他们必须基本上完全重新实现所有现有的文件系统功能来支持他们的事务—,这有点太过分了。

+0

该项目明确指出,不可能不是由于范围和项目规模问题,而仅仅是因为没有办法**。至于你的例子,因为要求所有的调用都通过API,这10个文件不需要同时被删除。库只需确保通过API的调用将该操作视为原子单元。例如。如果操作系统崩溃了,那么当程序重新启动时,库会运行代码来完成10个文件的删除操作,或者从它的日志中恢复中途删除的文件。 – Pacerier 2014-11-23 17:44:21

+0

@Pacerier。 。 。 OP的问题是为什么符合ACID标准的数据库可以在这个项目中说这是不可能的。 – 2014-11-23 20:31:31

+0

是的,我的评论试图说它**是可能的,那么为什么项目的情况恰恰相反呢? – Pacerier 2014-11-23 21:17:27

0

Windows提供NTFS上的事务。请参阅此处的描述:http://msdn.microsoft.com/en-us/library/windows/desktop/bb968806%28v=vs.85%29.aspx

目前不推荐使用此功能,并且MSDN中有其他场景的广泛讨论:http://msdn.microsoft.com/en-us/library/windows/desktop/hh802690%28v=vs.85%29.aspx

此外,如果您对文件系统进行定义,DBMS也是一种文件系统,并且文件系统(如NTFS或ext3)也可以在DBMS上实现。所以Apache的声明有点呃,不正确。

+0

然后是否可以在普通文件系统之上实现事务? – Pacerier 2014-11-25 06:50:30

+0

@Prier你叫什么“正常”?采用通用文件系统并以事务处理方式使用它?在Windows上,我可以想象一些文件系统过滤驱动程序,它可以为大多数文件系统访问做到这一点(尽管过滤器可以被绕过,并且这种方案不会很可靠)。在其他平台上,很可能需要内核修补程序。 – 2014-11-25 16:23:53

+0

是的,那么是否有可能在没有自己的内置机制的通用文件系统之上实现事务? – Pacerier 2014-11-27 20:26:56

相关问题