Erlang Mnesia - mnesia:交易(F)与mnesia:活动(交易,F)

时间:2013-10-26 21:12:59

标签: transactions erlang mnesia

我已经阅读并重新阅读了文档:mnesia:activity / 3,mnesia:activity / 4,以及mnesia / transaction / 2,但它们对我来说仍然像一本不起眼的外语。

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

有些善良的灵魂可以帮助我理解我何时以及为何使用其中一种?

非常感谢,

LRP

2 个答案:

答案 0 :(得分:5)

有两点不同。

首先,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来稍微缓解后者。

答案 1 :(得分:3)

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

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

现在在Erlang中,您有不同类型的交易支持[ Check here]:

  1. 交易(常规)
  2. sync_transaction(等待所有活动副本提交事务(到光盘))
  3. async_dirty(没有锁定和更新是异步完成的)
  4. sync_dirty(与async_dirty相同,只是调用将等到所有节点都更新)
  5. ets(对于不扩展到多个节点的RAM副本)
  6. 现在,回到问题,什么是活动呢?

    我怎么看,活动为我提供了一个通用界面,我可以使用它隐藏我正在做的事务类型的细节。在您的应用程序中,您可能在不同的部分或功能中具有不同的一致性和性能要求。

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

    除此之外,最大的区别是,活动允许您自定义Mnesia中记录的访问模式(在第二个链接中说明)。我必须说,必须由一位非常有经验的erlang程序员完成。对于大多数情况,提供的默认值必须足够。

    文件摘要:

      

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