【发布时间】:2013-11-05 21:03:29
【问题描述】:
我已经阅读并重新阅读了以下文档:mnesia:activity/3、mnesia:activity/4 和 mnesia/transaction/2,但它们对我来说仍然像是一种晦涩难懂的外语。
在我有限的实验中,它们似乎返回了相同的结果。
能否有好心人帮助我了解何时以及为什么要使用其中一个与另一个?
非常感谢,
LRP
【问题讨论】:
标签: transactions erlang mnesia
我已经阅读并重新阅读了以下文档:mnesia:activity/3、mnesia:activity/4 和 mnesia/transaction/2,但它们对我来说仍然像是一种晦涩难懂的外语。
在我有限的实验中,它们似乎返回了相同的结果。
能否有好心人帮助我了解何时以及为什么要使用其中一个与另一个?
非常感谢,
LRP
【问题讨论】:
标签: transactions erlang mnesia
有两个区别。
首先,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 在一定程度上缓解后者。
【讨论】:
首先,将“事务”视为一个概念,它只是保证一系列操作将以原子方式完成(一致的、隔离的和持久的以及制作 ACID 属性)。
如果任何操作失败,则该事务中先前操作执行的操作将回滚。
现在在 Erlang 中,您支持不同类型的事务 [ Check here]:
现在,回到这个问题,那么 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 行为的回调模块的名称
【讨论】: