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_copies
table。
我相信我可以用 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 进行一系列原始操作的方法,如果有的话。不会进行复制。
我创建了一个失忆症table,例如
mnesia:create_table(mytable, [{ram_copies, node()}, {local_content,true}],
{attributes, [col1,col2]}]).
因为local_content=true
,所以不能和其他节点共享数据,而且是ram_copies
table。
我相信我可以用 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 进行一系列原始操作的方法,如果有的话。不会进行复制。