ets doc、単一オブジェクトに対するすべての更新は、アトミックでも独立していることも保証されています。これは、単一のオブジェクトへの更新操作が、効果(アトミック性)なしで完全に成功または失敗し、更新の中間結果が他のプロセス(分離)によって見られないことを意味します。アールランETSアトミックおよびアイソレーション
これはErlangで一般的なパターンです:次のコードのための
は、私は1つ
私の質問に2つのテーブルを包ん?
挿入と更新の場合、原子単位で分離されていますか?
-module(example_store)。 -export([init/0, insert/1、 更新/ 1])。
のinit() - > ETS:新しい(店舗、[パブリック、 named_table、 {read_concurrency、真}、 {write_concurrency、真}])、
データ=のETS:新しい(store_data、 [公共、 named_table、 {read_concurrency、真}、{ 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
を分離することは保証できません。
Q3:それを分離することは可能ですか? (Gen_serverを除いて)
gen_serverとは別に、 'update'が分離されていることを保証するメソッドがありますか? – user3644708