aus der ets doc, Alle Updates für einzelne Objekte sind garantiert sowohl atomar als auch isoliert. Dies bedeutet, dass eine Aktualisierungsoperation für ein einzelnes Objekt entweder ohne Erfolg (Atomizität) erfolgreich ist oder fehlschlägt und dass keine Zwischenergebnisse der Aktualisierung von anderen Prozessen gesehen werden können (Isolation).Erlang ETS atomare und isolierte
für den folgenden Code, wickelte ich zwei Tabellen in einer
meine Fragen:
ist dies ein gemeinsames Muster in Erlang?
für die Einfügung und Aktualisierung, ist es atomar und isoliert?
-Modul (Beispielspeicher). -export ([init/0, insert/1, update/1]).
init() -> ets: neu (Speicher, [public, named_table, {read_concurrency, true}, {write_concurrency, true}]),
ets Data =: neu (store_data, [public, named_table, {read_concurrency, true}, { write_concurrency, true}]),
Info = ets:new(store_info, [public,ordered_set, named_table, {read_concurrency, true}, {write_concurrency, true}]), ets:insert(store, {store, Data, Info}). %% insert data insert({Key, Value, Info}) -> {store, Data_tb, Info_tb} = ets:lookup(store, store), ets:insert(Data_tb, {Key, Value}), ets:insert(Info_tb, {Info, Key}), ok. %% update data update({Key, Value, Info, Info_old}) -> {store, Data_tb, Info_tb} = ets:lookup(store, store), ets:insert(Data_tb, {Key, Value}), ets:delete(Info_tb, {Info_old,Key}), ets:insert(Info_tb, {Info, Key}), ok.
Update_1 von @Derek Brown, kann die eingewickelte Tabelle nicht garantieren insert/1
und update/1
isoliert werden.
Q3: Ist das möglich, um es isoliert zu machen? (abgesehen von dem Gen_server)
Gibt es neben dem gen_server eine Methode, um zu garantieren, dass das 'update' isoliert wurde? – user3644708