2

私はErlangの初心者です。ets テーブルについて質問がありました。

2 つの ets テーブルがあり、両方から値を挿入または削除する必要があります。

insert(V) ->
  ets:insert(table_test,V),
  ets:insert(table_cp,V).

delete(V)->
  ets:delete(table_test,V),
  ets:delete(table_cp,V). 

操作が成功したか、両方で失敗したかを保証するにはどうすればよいですか?

例えば挿入操作で、ets:insert(table_cp,V) に何か問題があった場合、talbe_test から値を削除しますか?

同じように削除します。ets:delete(table_cp,V) が失敗した場合、値を再挿入しますか?

助けてください。

4

1 に答える 1

6

あなたが求めているのは取引です。ETS はトランザクションをサポートしていません。最初の挿入が成功しなかった場合に他のテーブルに値を挿入しなくても、最初の挿入が成功した場合に 2 番目の値を挿入することを保証することはできません。プロセスが停止する可能性があります。

トランザクションが必要な場合mnesiaは、ETS の上に構築され、分散 Erlang ノード間でもトランザクションをサポートするものを検討してください。

それはすべて、両方に挿入されるか、どちらにも挿入されない値にどれだけ依存する必要があるかによって異なります。これらのテーブルの 1 つにのみ値を挿入してアプリケーションが生き残る (正しく動作する) 場合、または値が正しく挿入されていない場合に値を修正できる場合は、説明したようにプログラムによる失敗の処理がうまくいく可能性があります。そうでなければ、ETS は適切なデータ構造ではありません。

于 2016-05-14T14:05:00.027 に答える