2016-10-19 3 views
1

ets doc単一オブジェクトに対するすべての更新は、アトミックでも独立していることも保証されています。これは、単一のオブジェクトへの更新操作が、効果(アトミック性)なしで完全に成功または失敗し、更新の中間結果が他のプロセス(分離)によって見られないことを意味します。アールランETSアトミックおよびアイソレーション

  1. これはErlangで一般的なパターンです:次のコードのための

    は、私は1つ

    私の質問に2つのテーブルを包ん?

  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/1update/1を分離することは保証できません。

Q3:それを分離することは可能ですか? (Gen_serverを除いて)

答えて

1

1)いいえets:new/2からの返信は、named_tableを使用したときの最初の引数と同じ名前です。それで、あなたはstoreテーブルに名前を格納しています。したがって、insert/1update/1では、store_datastore_infoアトムをそのまま使用することもできます。

2)いいえ、挿入と更新はアトミックでも独立していません。 Erlangでは関数がどのように動作するのではないので、アトミックではありません。たとえば、insert/1の最初のets:insert/2コールは成功しましたが、何らかの理由で2番目のコールが失敗した場合、最初のコールバックの自動ロールバックはありません。また、特定の機能(たとえば、insert/1またはupdate/1)がアトミックに実行されるという保証がないため、分離されません。他のプロセスは、関数が完了する前に中間的な影響を見ることができます。

+0

gen_serverとは別に、 'update'が分離されていることを保証するメソッドがありますか? – user3644708

関連する問題