1

我有以下代码:

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 模块。

我究竟做错了什么 ?它怎么会是正确的?谢谢你。

4

1 回答 1

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).
于 2011-05-29T16:48:54.693 回答