erlang - ets `public` `named`表和 `local`和 `ram_copy` mnesia表有什么区别

标签 erlang mnesia ets

我创建了一个 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]).

我想从性能的角度来看,它们是相似的。

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

最佳答案

表是存储的后端。区别在于 Mnesia 支持的交易处理,而不是 ETS。

事实上,Mnesia 的事务处理依赖于 transaction context used :

  • transaction:将一系列数据库操作作为单个功能 block 运行。整个 block 将在所有节点上运行或不在任何节点上运行;它完全成功或完全失败。这种类型的事件上下文是部分异步的:对于本地节点上的操作,它将是同步的,但它只会等待其他节点确认他们将提交交易,而不是他们已经完成交易。
  • sync_transaction:和transaction差不多,但是它是跨所有节点同步的。
  • async_dirty:绕过所有事务协议(protocol)和锁定事件(但请注意,它会在继续之前等待事件事务完成)
  • sync_dirty:将等待远程节点上一切正常的确认,但仍将远离所有锁定或事务上下文。
  • ets:基本上是一种绕过 Mnesia 所做的一切并对底层 ETS 表(如果有的话)进行一系列原始操作的方法。不会进行复制。

关于erlang - ets `public` `named`表和 `local`和 `ram_copy` mnesia表有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31763646/

相关文章:

caching - Elixir 中的分布式缓存

azure - Yaws 服务器在 Azure 的本地主机上启动,但无法从 cloudapp.net 访问

erlang - 如何将节点添加到 mnesia 集群?

erlang - 在 Erlang 中定期做某事的最佳方法是什么?

http - Web 服务器容忍高客户端轮询率 : Cowboy vs. Yaws Web 服务器

database - Erlang Mnesia 等效于 SQL Select FROM WHERE Field IN (value1, value2, value3, ...)

elixir - 字符串操作 : join with comma

erlang - 如何查找erlang ets表字段信息?

operating-system - 如何在erlang中连续显示os命令输出?

list - Erlang 列出了超过 8 的单个数字?