Erlang Mnesia вложенная транзакция прервана - PullRequest
1 голос
/ 29 мая 2011

У меня есть следующий код:

J = fun()->mnesia:clear_table(names) end.
 mnesia:activity(transaction, J, [], mnesia_frag).

, и я получаю эту ошибку:

** exception exit: {aborted,{aborted,nested_transaction}}

я мог бы просто запустить

mnesia:clear_table(names) 

, но с именем таблицыЯ думаю, что мне нужно использовать модуль mnesia_frag.

Что я делаю неправильно?и как это будет правильно?Спасибо.

1 Ответ

6 голосов
/ 29 мая 2011

вы правы, что mnesia: clear_table (names) не очистит всю фрагментированную таблицу.

mnesia: clear_table / 1 уже выполняется внутри транзакции, поэтому его нельзя использовать с mnesia: activity транзакция AccessContext.

вместо этого попробуйте:

mnesia:activity(sync_dirty, fun mnesia:clear_table/1, [names], mnesia_frag).

если вы посмотрите на исходный код в mnesia_frag.erl, вы увидите, что он просто вызывает mnesia: clear_table / 1 для каждой отдельной таблицы. Предполагая 4 фрага, вышеприведенное в основном эквивалентно:

[mnesia:clear_table(T) || T <- [names, names_frag2, names_frag3, names_frag4]].

имена таблиц:

mnesia_frag:frag_names(names).
...