ets `public` `named` table 和 `local` 和 `ram_copy` mnesia table 之间有什么区别

what the difference between ets `public` `named` table and `local` and `ram_copy` mnesia table

我创建了一个失忆症table,例如

mnesia:create_table(mytable, [{ram_copies, node()}, {local_content,true}], 
                              {attributes, [col1,col2]}]).

因为local_content=true,所以不能和其他节点共享数据,而且是ram_copiestable。

我相信我可以用 ets table 做同样的事情,如下所示。

ets:new(mytable,[named_table, public]).

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

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

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

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

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