ETS 公共命名表格和 Mnesia 本地和 RAM_Copy 表格之间的区别是什么?

3
我创建了一个Mnesia表,例如:
mnesia:create_table(mytable, [{ram_copies, node()}, {local_content,true}], 
                              {attributes, [col1,col2]}]).

由于local_content=true,所以它无法与其他节点共享数据,并且它是一个ram_copies表。

我相信我可以使用以下的ets表来完成相同的事情。

ets:new(mytable,[named_table, public]).

就性能而言,我想它们是相似的。

从语义角度来看,这两个表有何不同?

1个回答

2

表格是存储的后端。不同之处在于Mnesia支持事务处理,而ETS不支持。

实际上,Mnesia的事务处理取决于所使用的事务上下文

  • transaction:将一系列数据库操作作为单个功能块运行。整个块将在所有节点上运行或全部不运行; 它完全成功或完全失败。此类型的活动上下文部分异步:对于本地节点上的操作,它将是同步的,但它仅等待其他节点确认它们将提交事务,而不是已完成。
  • sync_transaction:与transaction基本相同,但在所有节点上都是同步的。
  • async_dirty:绕过所有事务协议和锁定活动(请注意,在继续之前,它将等待活动事务完成)
  • sync_dirty:将等待远程节点确认事情进展顺利,但仍将远离所有锁定或事务上下文。
  • ets:基本上是绕过Mnesia的所有操作,并对底层ETS表执行一系列原始操作(如果有)。不会进行任何复制。

谢谢!这非常有帮助。如果我总是对mnesia表使用dirty_xxx函数,即我不关心事务,则在这种情况下最好使用ets表而不是mnesia表。我是正确的吗? - wcy
1
这实际上取决于您的使用情况。如果您可以查看 ets 模块并且它具有您需要的功能,则直接使用可能已经足够了。 - I GIVE TERRIBLE ADVICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接