我创建了一个 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/