7

レコードを使用して作成された、i​​、a、bの3つのフィールドを持つmnesiaテーブルがあります。

-record(rec, {i, a,b}).

次に、次のようにテーブルに行を挿入します。

mnesia:transaction( fun() -> mnesia:write("T", #rec{i=1, a=2, b=3}, write) end ).

この行を更新し、iとbを同じ値のままにして、aの値のみを10に変更する場合は、どうすればよいですか?""のようなSQLに相当するものはありますUPDATE T SET a=10 WHERE i=1か?

私がこのようなことをした場合:

mnesia:transaction( fun() -> mnesia:write("T", #rec{i=1, a=10}, write) end )

行は次のように保存されます。

{rec,1,10,undefined}
4

2 に答える 2

10

この関数の値は、mnesia:transaction で使用された場合に更新されます

update_a(Tab, Key, Value) ->
  fun() ->
    [P] = mnesia:wread({Tab, Key}),
    mnesia:write(P#pixel{a=Value})
  end.

提案: SQL 構文により近い構文シュガーが必要な場合は、QLC をのぞいてみてください。

パフォーマンスはもちろん最高のベンチマークですが、QLC にはオーバーヘッドがあり、他の詳細と比較して関連性があるかどうかはわかりません。あなたが与えたSQLの例は、i=1. QLC を使用してその一連のレコードを抽出することは、mnesia コールよりも優れています。

wreadまた、レコードを更新することが事前にわかっているため、レコードの書き込みロックを直接要求することに注意してください。これは、最初に読み取りロックを回避し、次に気が変わって書き込みロックを取得するマイクロ最適化です。私は長い間それをベンチマークしていませんでした。

パフォーマンスがまだ問題である場合は、ダーティ オペレーションを使用するさまざまなアプローチを検討する必要があります。しかし、「十分に高速」であるためには、1 秒あたりに必要なトランザクション数を把握する必要があります。

于 2009-11-30T17:01:11.233 に答える
2

「行」を読み取り、必要なフィールドを更新してから、結果これらすべての操作を「トランザクション」内に書き戻す必要があると思います。

于 2009-11-30T17:00:04.010 に答える