2011-05-29 43 views
1

我有以下代码:二郎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模块的几个节点上分裂。

我在做什么错?它将如何正确? 谢谢。

回答

5

你是正确的,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个frag,上面基本上等同于:

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

来自的表名:

mnesia_frag:frag_names(names). 
+0

非常感谢你。 – Andreas 2011-05-29 17:02:08