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)