【问题标题】:Erlang Mnesia - mnesia:transaction(F) vs. mnesia:activity(transaction, F)Erlang Mnesia - mnesia:transaction(F) 与 mnesia:activity(transaction, F)
【发布时间】:2013-11-05 21:03:29
【问题描述】:

我已经阅读并重新阅读了以下文档:mnesia:activity/3、mnesia:activity/4 和 mnesia/transaction/2,但它们对我来说仍然像是一种晦涩难懂的外语。

在我有限的实验中,它们似乎返回了相同的结果。

能否有好心人帮助我了解何时以及为什么要使用其中一个与另一个?

非常感谢,

LRP

【问题讨论】:

    标签: transactions erlang mnesia


    【解决方案1】:

    有两个区别。

    首先,mnesia:activity 允许您指定访问模块。我知道的唯一用途是使用碎片表。也就是说,如果您有一个包含许多记录的表,您可能希望在集群中的节点之间拆分数据。 mnesia_frag 访问模块允许您这样做,并且仍然可以透明地访问数据 - 只要您使用 mnesia:activity 并指定 mnesia_frag 作为访问模块。请参阅the section on Table Fragmentation in the Mnesia documentation 了解更多信息。

    其次,mnesia:transaction 在成功时返回 {atomic, Result},在错误时返回 {aborted, Reason}。另一方面,mnesia:activity 只是在成功时返回Result,如果出现问题则发出错误信号。您喜欢哪种风格主要取决于口味 - 但请注意,如果您不检查每个返回值,mnesia:transaction 可能会“默默地”失败。

    除了功能上的差异之外,使用mnesia:activity,您可以根据需要轻松更改代码中的访问上下文。如果您开始使用事务但后来想更改为脏操作(反之亦然),您可以简单地将第一个参数更改为您的 mnesia:activity 调用,而如果您一直在使用 mnesia:transaction 并直接调用 mnesia:dirty_* ,从一个更改为另一个涉及更多。 (您可以通过使用mnesia:sync_dirty 和/或mnesia:async_dirty 在一定程度上缓解后者。

    【讨论】:

      【解决方案2】:

      首先,将“事务”视为一个概念,它只是保证一系列操作将以原子方式完成(一致的、隔离的和持久的以及制作 ACID 属性)。

      如果任何操作失败,则该事务中先前操作执行的操作将回滚。

      现在在 Erlang 中,您支持不同类型的事务 [ Check here]:

      1. 事务(常规)
      2. sync_transaction(等到所有活动副本都提交事务(到磁盘))
      3. async_dirty(没有锁定和异步更新)
      4. sync_dirty(同async_dirty,只是调用会等到所有节点都更新)
      5. ets(用于不扩展到多个节点的 RAM 副本)

      现在,回到这个问题,那么 Activity 是什么?

      我的看法是,activity 为我提供了一个通用接口,使用它我可以隐藏我实际正在执行的事务类型的详细信息。在您的应用程序中,您可能对不同的部分或功能有不同的一致性和性能要求。

      因此,您可以将要执行的事务类型作为活动调用 [Check Here ] 的第一个参数传递。

      除此之外,最大的不同是,activity 允许您自定义 Mnesia 中记录的访问方式(在第二个链接中解释)。我必须说,必须由非常有经验的 erlang 程序员才能完成。对于大多数情况,提供的默认值必须足够。

      文档除外:

      这个函数 (mnesia:activity/4) 在一个重要方面不同于 mnesia:transaction、mnesia:sync_transaction、mnesia:async_dirty、mnesia:sync_dirty 和 mnesia:ets 函数。 AccessMod 参数是实现 mnesia_access 行为的回调模块的名称

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-14
        • 2014-02-16
        • 1970-01-01
        • 2011-04-14
        相关资源
        最近更新 更多