Erlang ets'public`` named`表与'local`和'ram\u copy` mnesia表有什么区别

Erlang ets'public`` named`表与'local`和'ram\u copy` mnesia表有什么区别,erlang,mnesia,ets,Erlang,Mnesia,Ets,我创建了一个记忆表,例如 mnesia:create_table(mytable, [{ram_copies, node()}, {local_content,true}], {attributes, [col1,col2]}]). 因为local\u content=true,所以它不能与其他节点共享数据,并且它是一个ram\u副本表 我相信我可以用ets表做同样的事情,如下所示 ets:new(mytable,[named_ta

我创建了一个记忆表,例如

mnesia:create_table(mytable, [{ram_copies, node()}, {local_content,true}], 
                              {attributes, [col1,col2]}]).
因为
local\u content=true
,所以它不能与其他节点共享数据,并且它是一个
ram\u副本

我相信我可以用ets表做同样的事情,如下所示

ets:new(mytable,[named_table, public]).
我想从性能的角度来看,它们是相似的


我想知道,从语义的角度来看,这两个表之间有什么区别

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

事实上,Mnesia的交易处理取决于:

  • 事务
    :作为单个功能块运行一系列数据库操作。整个块将在所有节点上运行,或不在任何节点上运行;它要么完全成功,要么完全失败。这种类型的活动上下文部分是异步的:对于本地节点上的操作,它是同步的,但它只等待其他节点确认它们将提交事务,而不是确认它们已经完成了事务
  • sync\u事务
    :与
    事务
    几乎相同,但它在所有节点上都是同步的
  • async\u dirty
    :绕过所有事务协议和锁定活动(注意,它将在继续之前等待活动事务完成)
  • sync\u dirty
    :将等待确认远程节点上一切正常,但仍将远离所有锁定或事务上下文
  • ets
    :基本上是一种绕过Mnesia所做的一切并对底层ets表(如果有)执行一系列原始操作的方法。不会进行复制

谢谢!这很有帮助。如果我总是对mnesia表使用dirty_xxx函数,即我不关心事务,那么在这种情况下,最好使用ets表而不是mnesia表。我说的对吗?这完全取决于你的用例。如果您可以查看
ets
模块,并且它具有您需要的功能,那么直接使用它就足够了。