我已经阅读并重新阅读了文档:mnesia:activity / 3,mnesia:activity / 4,以及mnesia / transaction / 2,但它们对我来说仍然像一本不起眼的外语。
在我有限的实验中,它们似乎返回相同的结果。
有些善良的灵魂可以帮助我理解我何时以及为何使用其中一种?
非常感谢,
LRP
答案 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]:
现在,回到问题,什么是活动呢?
我怎么看,活动为我提供了一个通用界面,我可以使用它隐藏我正在做的事务类型的细节。在您的应用程序中,您可能在不同的部分或功能中具有不同的一致性和性能要求。
因此,您可以将要执行的事务类型作为活动调用[Check Here ]的第一个参数传递。
除此之外,最大的区别是,活动允许您自定义Mnesia中记录的访问模式(在第二个链接中说明)。我必须说,必须由一位非常有经验的erlang程序员完成。对于大多数情况,提供的默认值必须足够。
文件摘要:
此函数(mnesia:activity / 4)在重要方面与mnesia:transaction,mnesia:sync_transaction,mnesia:async_dirty,mnesia:sync_dirty和mnesia:ets函数不同。 AccessMod参数是实现mnesia_access行为的回调模块的名称