【问题标题】:Are transactions on top of "normal file system" possible?“普通文件系统”之上的事务是否可能?
【发布时间】:2015-01-21 05:48:38
【问题描述】:

seems to be possible 使用预写日志记录、两阶段提交和影子分页等技术在普通文件系统之上实现事务。

确实,它必须是可能的,因为像 InnoDB 这样的事务数据库引擎可以部署在普通文件系统之上。还有像XADisk这样的库。

但是,Apache Commons Transaction 状态:

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

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

在普通文件系统之上做事务是不可能的吗?

【问题讨论】:

    标签: java mysql database filesystems


    【解决方案1】:

    此答案纯属推测,但您可能是在比较苹果和橙子。或者更准确地说,是牛奶和奶制品。

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

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

    更通用的事务系统还有其他挑战。例如,它需要原子动作来处理更多事情。例如。如果您“以事务方式”删除 10 个文件,则所有这些文件都必须同时消失。我认为“传统”文件系统不具备这种能力。

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

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

    【讨论】:

    • 项目明确表示不可能,不是因为范围和项目规模的问题,而是因为没有没有办法去做。至于您的示例,由于要求所有调用都通过 API,因此不需要同时删除 10 个文件。该库只需要确保通过 API 的调用将操作视为一个原子单元。例如。如果操作系统在操作过程中崩溃,那么当程序重新启动时,库将运行代码以完成 10 个文件的删除或从其日志中恢复中途删除的文件。
    • @Pacerier 。 . . OP 的问题是为什么符合 ACID 的数据库可以在这个项目说不可能的情况下做到这一点。
    • 是的,我的评论试图说它可能的,那么为什么该项目的说法相反呢?
    • 我的回答是说数据库做的事情比一般系统更简单,只需要底层文件系统的有限功能来构建数据库所需的结构。
    【解决方案2】:

    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的说法有点,嗯,不正确。

    【讨论】:

    • 是否有可能在普通文件系统之上实现事务?
    • @Pacerier 你怎么称呼“正常”?采用通用文件系统并以交易方式使用它?在 Windows 上,我可以想象一些文件系统过滤器驱动程序能够对大多数文件系统访问执行此操作(尽管可以绕过过滤器,并且这种方案不是很可靠)。在其他平台上很可能需要内核补丁。
    • 是的,那么是否可以在没有自己的内置机制的通用文件系统之上实现事务?
    • @Pacerier 要使事务正常工作,您必须控制的所有文件系统请求都必须有一个单一的入口点。对于文件系统,驱动程序代码是入口点。所以你必须修补文件系统驱动程序。
    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    相关资源
    最近更新 更多