5

mnesia:async_dirty() に渡された関数内で実行される一連の mnesia:dirty_ コマンドと、「生」で実行されるまったく同じトランザクションの違いは何ですか?

つまり、次のことの間に違いはありますか:

mnesia:dirty_write({table, Rec1}),
mnesia:dirty_write({table, Rec1}),
mnesia:dirty_write({table, Rec1})

F = fun() ->
        mnesia:dirty_write({table, Rec1}),
        mnesia:dirty_write({table, Rec1}),
        mnesia:dirty_write({table, Rec1})
   end,

   mnesia:async_dirty(F)

ありがとう

4

1 に答える 1

-1

async_dirtyまず、コンテキストに関するユーザーズガイドを引用しましょう。


関数mnesia:async_dirty(Fun [、Args])に引数と同じ「fun」を渡すことにより、ダーティコンテキストで実行されます。関数呼び出し
は、対応するダーティ関数マップされます。これには、ロギング、レプリケーション、およびサブスクリプションが引き続き含まれますが、ロック、ローカルトランザクションストレージ、またはコミットプロトコルは含まれません。チェックポイントリテーナは更新されますが、「ダーティ」に更新されます。したがって、それらは非同期的に更新されます。関数は、操作が1つのノードで実行されるのを待ちますが、他のノードでは実行されません。テーブルがローカルに存在する場合、待機は発生しません。




指定した2つのオプションは同じ方法で実行されます。ただし、オプション1のようにダーティ関数を実行するとfun、それぞれがmnesiaへの個別の呼び出しになります。を使用async_dirtyすると、3つの呼び出しがバンドルされ、mnesiaはローカルノードで3つが完了するまで待機して戻ります。
ただし、これら2つの動作は、Mnesiaマルチノードクラスターでは異なる場合があります。いくつかのテストを行います:)

于 2012-11-10T09:20:49.693 に答える