transactions - Erlang Mnesia - mnesia :transaction(F) vs. mnesia :activity(transaction, F)

标签 transactions erlang mnesia

我已经阅读并重新阅读了文档 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/

相关文章:

erlang - Mnesia:查询 ordered_set 表时,返回的记录是否按保证顺序返回?

web-services - Erlang 和 SOAP 服务 - 进退两难

php - 事务无法在 codeigniter 中回滚

Erlang 列表过滤器语法

erlang - 在 Elixir 中声明 zip 存档内容的最佳方法是什么?

Erlang工作进程

节点之间的 Erlang Ets 表

.net - 即使事务回滚,SQL 标识(自动编号)也会增加

python - 在各种游标/连接上使用 BEGIN TRANSACTION/ROLLBACK/COMMIT

angular - 为什么我的 Firebase 交易已过期或不再有效?