2016-10-19 2 views
1

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:

  1. ist dies ein gemeinsames Muster in Erlang?

  2. 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)

Antwort

1

1) Nein. Die Rückkehr von ets:new/2, wenn Sie named_table verwenden, ist der gleiche Name, den Sie für das erste Argument verwendet haben. Das speichern Sie in der store Tabelle - die Namen. Also in insert/1 und update/1 können Sie auch die store_data und store_info Atome direkt verwenden.

2) Nein, die Inserts und Updates sind weder atomar noch isoliert. Nicht atomar, weil Funktionen in Erlang nicht funktionieren. Wenn, sagen wir, der erste ets:insert/2 Anruf in Ihrem insert/1 erfolgreich war, aber der zweite aus irgendeinem Grund fehlgeschlagen ist, gibt es keine Art von automatischem Rollback für den ersten. Und nicht isoliert, weil es einfach keine Garantie gibt, dass eine gegebene Funktion (z. B. insert/1 oder update/1) atomar ausgeführt wird. Andere Prozesse können die Zwischeneffekte sehen, bevor Ihre Funktionen abgeschlossen sind.

+0

Gibt es neben dem gen_server eine Methode, um zu garantieren, dass das 'update' isoliert wurde? – user3644708