2011-05-29 3 views
1

j'ai le code suivant:Erlang Mnesia transaction imbriquée avorté

J = fun()->mnesia:clear_table(names) end. 
mnesia:activity(transaction, J, [], mnesia_frag). 

et je reçois cette erreur:

** exception exit: {aborted,{aborted,nested_transaction}} 

je pouvais courir

mnesia:clear_table(names) 

mais comme nom de la table est fragmenté sur plusieurs nœuds je pensais que je devais utiliser le module mnesia_frag.

qu'est-ce que je fais mal? et comment serait-ce correct? Merci.

Répondre

5

vous avez raison de dire que mnesia: clear_table (noms) n'effacera pas toute la table fragmentée. Mnesia: clear_table/1 s'exécute déjà dans une transaction, vous ne pouvez donc pas l'utiliser avec l'activité mnesia: transaction AccessContext.

Essayez plutôt:

mnesia:activity(sync_dirty, fun mnesia:clear_table/1, [names], mnesia_frag). 

si vous regardez le code source dans mnesia_frag.erl, vous verrez qu'il est juste d'appeler mnesia: clear_table/1 sur chaque table. En supposant que 4 frags, ce qui précède est essentiellement équivalente à:

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

les noms de table provenant de:

mnesia_frag:frag_names(names). 
+0

Merci beaucoup. – Andreas

Questions connexes