Erlang Mnesia嵌套事务中止

And*_*eas 1 erlang transactions nested mnesia abort

我有以下代码:

J = fun()->mnesia:clear_table(names) end.
 mnesia:activity(transaction, J, [], mnesia_frag).
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

** exception exit: {aborted,{aborted,nested_transaction}}
Run Code Online (Sandbox Code Playgroud)

我可以跑了

mnesia:clear_table(names) 
Run Code Online (Sandbox Code Playgroud)

但由于表名在几个节点上分散,我认为我必须使用mnesia_frag模块.

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

小智 6

你是正确的mnesia:clear_table(names)不会清除整个碎片表.

mnesia:clear_table/1已在事务内部运行,因此您无法将其与mnesia:activity 事务 AccessContext一起使用.

而是尝试:

mnesia:activity(sync_dirty, fun mnesia:clear_table/1, [names], mnesia_frag).
Run Code Online (Sandbox Code Playgroud)

如果你看一下mnesia_frag.erl中的源代码,你会发现它只是在每个表上调用mnesia:clear_table/1.假设4个frags,上面基本相当于:

[mnesia:clear_table(T) || T <- [names, names_frag2, names_frag3, names_frag4]].
Run Code Online (Sandbox Code Playgroud)

表名来自:

mnesia_frag:frag_names(names).
Run Code Online (Sandbox Code Playgroud)