2016-05-14 5 views
2

私はErlang newbieです。私はetsテーブルについて質問を受けました。Erlangは複数のテーブルに挿入します

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

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)で何か問題がある場合、insertオペレーションは、talbe_testから値を削除する必要がありますか?

ets:delete(table_cp、V)が失敗した場合は、値を再挿入する必要がありますか?

助けてください。

+1

あなたはErlang初心者だと言いますが、すでにMnesiaを避けることに決めましたか? @ Amiramixの答えが指摘しているように、Mnesiaはトランザクションセマンティクスを持つ最も簡単な方法です。これはErlangに組み込まれているので、追加の依存関係はなく、実行しようとしているのであれば、メモリのみ(ファイルシステムへのアクセスなし)に設定することができます。 –

答えて

5

あなたが求めているのはトランザクションです。 ETSは取引をサポートしていません。最初の挿入が成功しなかった場合に別のテーブルに値を挿入しない場合でも、最初の挿入が成功した場合は、2つの値の間に何かが発生する可能性があるため、プロセスが死ぬことがあります。

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

これは、両方に挿入する値に依存する必要があるか、どちらにも依存しないことに依存します。これらのテーブルの1つにのみ値を挿入してアプリケーションを正常に動作させることができます(誤って挿入した場合に値を修正できる場合)。さもなければETSは正しいデータ構造ではないでしょう。

+0

ありがとうございます。私は間抜けを避けようとしています:( – user3644708

+1

あなたは別のデータベースを試すことができますが、ETSに確実に実装することはできません。あなた自身がトランザクションを実装しようとする場合は、http: //stackoverflow.com/questions/5365401/how-do-database-vendors-implement-transactions – Amiramix

関連する問題