我已经阅读并重新阅读了文档 re: mnesia:activity/3、mnesia:activity/4 和 mnesia/transaction/2,但它们对我来说仍然像是一种晦涩难懂的外语。
在我有限的实验中,它们似乎返回了相同的结果。
某个善良的灵魂可以帮助我理解何时以及为什么要使用一个与另一个?
非常感谢,
LRP
最佳答案
有两个区别。
一、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
来稍微缓解后者)。
关于transactions - Erlang Mnesia - mnesia :transaction(F) vs. mnesia :activity(transaction, F),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19611961/