我创建了一个 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
:将一系列数据库操作作为单个功能块运行。整个区块将在所有节点上运行或不运行;它完全成功或完全失败。这种类型的事件上下文是部分异步的:它对于本地节点上的操作将是同步的,但它只会等待其他节点确认他们将提交事务,而不是他们已经完成了。 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/