4

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

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

某个善良的灵魂可以帮助我理解何时以及为什么要使用一个与另一个?

非常感谢,

LRP

4

2 回答 2

7

有两个区别。

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

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

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

于 2013-10-27T11:14:19.177 回答
4

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

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

现在在 Erlang 中,您支持不同类型的事务 [检查这里]:

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

现在,回到问题,那么什么是活动?

我的看法是,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 行为的回调模块的名称

于 2013-10-27T05:00:15.000 回答