2016-05-14 76 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