從ets doc,對單個對象的所有更新都保證是原子的和孤立的。這意味着對單個對象的更新操作要麼成功就要麼完全失敗(原子性),並且其他進程不能看到更新的中間結果(隔離)。Erlang ETS原子和分離
爲下面的代碼,我包兩個表爲一個
我的問題:
這是在二郎山一個共同的模式?
爲插入和更新,它是原子和孤立?
-module(example_store)。 -export([init/0, insert/1, update/1])。
的init() - > ETS:新的(存儲,[公衆, named_table, {read_concurrency,TRUE}, {write_concurrency,真}]),
數據= ETS:新(store_data, [公衆, named_table, {read_concurrency,TRUE},{ write_concurrency,真}]),
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 來自@Derek Brown,包裹的表不能保證insert/1
和update/1
被隔離。
問題3:是否有可能將它隔離? (除Gen_server外)
除了gen_server之外,有沒有一種方法可以保證'update'被隔離? – user3644708