ets`public``name`表和`local`和`ram_copy` mnesia表之间的区别是什么

时间:2015-08-01 16:18:01

标签: 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]).

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

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

1 个答案:

答案 0 :(得分:2)

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

事实上,Mnesia的交易处理取决于transaction context used

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