Erlang ets插入多个表

Posted

技术标签:

【中文标题】Erlang ets插入多个表【英文标题】:Erlang ets insert into multiple tables 【发布时间】:2016-09-10 16:03:49 【问题描述】:

我是 Erlang 新手。我有一个关于 ets 表的问题。

我有两个 ets 表,我需要从两个表中插入或删除值。

insert(V) ->
  ets:insert(table_test,V),
  ets:insert(table_cp,V).

delete(V)->
  ets:delete(table_test,V),
  ets:delete(table_cp,V). 

如何保证操作成功或失败?

比如insert操作,如果ets:insert(table_cp,V)有问题,要不要把talbe_test的值删掉?

同样删除,如果ets:delete(table_cp,V)失败,我要重新插入值吗?

请帮忙。

【问题讨论】:

你说你是 Erlang 新手,但你已经决定避开 Mnesia?正如@Amiramix 的回答所指出的,Mnesia 是拥有事务语义的最简单方法。它是 Erlang 内置的,因此没有额外的依赖项,并且可以配置为仅在内存中(无文件系统访问),如果这是您想要完成的。 【参考方案1】:

您要求的是交易。 ETS 不支持交易。即使您在第一次插入不成功时不将值插入到另一个表中,如果第一次插入成功,您也不能保证插入第二个值,因为这两次写入之间可能会发生某些事情,例如该进程可能会终止。

如果您需要交易,请考虑mnesia,它建立在 ETS 之上并提供交易支持,甚至跨分布式 Erlang 节点。

这完全取决于您需要多少依赖插入的值或两者都不插入。如果您的应用程序可以在仅将值插入其中一个表的情况下存活(正常工作),或者如果它能够在插入不正确的情况下更正该值,那么您所描述的以编程方式处理故障可能会正常工作。否则 ETS 将不是正确的数据结构。

【讨论】:

我明白了。您可以尝试不同的数据库,但无法在 ETS 中可靠地实现您想要的。如果您坚持可以尝试自己实现事务,请参阅此示例:***.com/questions/5365401/…

以上是关于Erlang ets插入多个表的主要内容,如果未能解决你的问题,请参考以下文章

Erlang ets 移除/过滤元素

Erlang ETS 插入/2 错误

Erlang ETS 原子和隔离

从 ets:lookup() 中提取值 - Erlang

Erlang ETS Table

在不使用保护子句的情况下过滤 erlang ets 表