Erlang: Mnesia: обновление значения одного поля подряд - PullRequest
7 голосов
/ 30 ноября 2009

У меня есть таблица мнезий с тремя полями, i, a и b, созданная с использованием записи

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

Теперь я вставляю строку в таблицу как:

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

Что мне делать, если я хочу обновить эту строку и изменить только значение a на 10, оставив i и b с одинаковыми значениями? Есть ли какой-нибудь 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}

Ответы [ 2 ]

9 голосов
/ 30 ноября 2009

Значение этой функции будет обновляться, если используется в мнезии: транзакция

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

Предложение: загляните в QLC, если вам нужен синтаксический сахар, который больше похож на синтаксис SQL.

Производительность, конечно, лучше всего оценивается, но у QLC есть издержки, я не уверен, что они актуальны по сравнению с другими деталями. Я просто подумал, что приведенный вами пример SQL обновит все записи, имеющие i=1. Использование QLC для извлечения этого набора записей красивее, чем вызовы mnesia.

Также следует заметить, что wread требует блокировки записи напрямую, потому что мы заранее знаем, что обновим эту запись. Это микрооптимизация, чтобы сначала избежать блокировки чтения, а затем передумать и получить блокировку записи. Я не проверял это в течение долгого времени, хотя.

Если производительность по-прежнему остается проблемой, вам следует рассмотреть различные подходы, в которых вы используете грязные операции. Но вы действительно должны попытаться выяснить, сколько транзакций в секунду вам нужно, чтобы быть «достаточно быстрым».

2 голосов
/ 30 ноября 2009

Полагаю, вам нужно прочитать «строку», обновить любое нужное поле, а затем записать результат и всех этих операций в рамках «транзакции».

...