2016-05-14 64 views
2

我是Erlang新手。我有一个关于ets表的问题。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). 

我该如何保证手术成功或失败?例如,插入操作,如果在ets:insert(table_cp,V)处有错误,我应该从talbe_test中删除该值吗?

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

请大家帮忙。

+1

你说你是Erlang新手,但你已经决定避开Mnesia?正如@ Amiramix的回答指出的那样,Mnesia是拥有事务语义的最简单的方法。它内置了Erlang,因此不需要额外的依赖关系,并且可以配置为仅在内存中(无文件系统访问),如果这是您要完成的任务。 –

回答

5

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

如果您需要交易,请考虑构建在ETS之上的mnesia,并且即使在分布式Erlang节点上也支持交易。

这一切都取决于您需要依赖插入到两者或两者的值。如果您的应用程序可以在只有其中一个表插入的值存活(正常工作)的情况下,或者如果它能够在错误插入时更正该值,那么您所描述的编程处理失败可能会正常工作。否则ETS将不是正确的数据结构。

+0

谢谢。我试图避免mnesia :( – user3644708

+1

我明白了,你可以尝试一个不同的数据库,但是你不能在ETS中可靠地实现你想要的东西,如果你坚持你可以尝试自己实现事务,请看这个例子:http: //stackoverflow.com/questions/5365401/how-do-database-vendors-implement-transactions – Amiramix