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插入多个表的主要内容,如果未能解决你的问题,请参考以下文章