2011-05-29 113 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