3

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

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]).

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

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

4

1 回答 1

2

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

事实上,Mnesia 的事务处理依赖于使用的事务上下文

  • transaction:将一系列数据库操作作为单个功能块运行。整个区块将在所有节点上运行,或者一个都不运行;它完全成功或完全失败。这种类型的活动上下文是部分异步的:它将对本地节点上的操作是同步的,但它只会等待其他节点确认他们将提交事务,而不是他们已经完成。
  • sync_transaction: 与 几乎相同transaction,但它在所有节点之间是同步的。
  • async_dirty: 绕过所有事务协议和锁定活动(但请注意,它将等待活动事务完成后再继续)
  • sync_dirty: 将等待确认远程节点上一切正常,但仍将远离所有锁定或事务上下文。
  • ets:基本上是一种绕过 Mnesia 所做的一切并对底层 ETS 表(如果有的话)进行一系列原始操作的方法。不会进行复制。
于 2015-08-01T20:10:06.440 回答