Erlang Mnesia嵌套事务中止

时间:2011-05-29 14:37:28

标签: transactions erlang nested abort mnesia

我有以下代码:

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 个答案:

答案 0 :(得分:6)

你是正确的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个frags,上面基本上相当于:

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

表名来自:

mnesia_frag:frag_names(names).