我是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中的值吗?
与delete相同,如果ets:delete(table_cp,V)失败,我应该重新插入该值吗?
请帮忙。
您所要求的是一个事务。ETS不支持交易。即使在第一次插入不成功的情况下不在另一个表中插入值,也不能保证在第一次成功的情况中插入第二个值,因为这两次写入之间可能会发生一些事情,例如进程可能会终止。
如果您需要交易,请考虑mnesia
,它构建在ETS之上,为交易提供支持,甚至跨分布式Erlang节点。
这完全取决于你需要在多大程度上依赖于同时插入或两者都不插入的值。如果您的应用程序能够在仅将值插入其中一个表的情况下生存(正常工作),或者如果在值插入错误的情况下能够更正该值,则您所描述的对故障的编程处理可能会正常工作。否则ETS就不是正确的数据结构。