nterceptando involuntariamente reintentos transaccionales de Mnesia con resultados de prueba / captura en todo tipo de rarezas

Entonces, estaba teniendo todo tipo de problemas con las operaciones CRUD en conjuntos de registros en una transacción. Me llevó a publicar 2 preguntas aquí,Problem yMas problema. Sin embarg, Creo que ambos problemas fueron creados por lo siguiente: Dentro de mis transacciones, incluí mi mnesia: escrituras, lecturas, etc. en bloques try / catch que capturaban todo, incluidas las transacciones abortadas de mnesia, como parte de su algoritmo de evitación de puntos muertos. I.e.,

insert(Key, Value) ->
   F = 
      fun() ->
         case sc_store:lookup(Key) of
           {ok, _Value}       -> sc_store:replace(Key, Value);
           {error, not_found} -> sc_store:insert(Key,Value)
         end
       end,
   try
      case mnesia:transaction(F) of
         {atomic, Result}  -> Result;
         {aborted, Reason} -> ...
      end
    catch
        Error:Reason -> ...
    end

fina

sc: lookup / 1, por ejemplo, se veía así:

lookup(Key) ->
   try 
      case mnesia:read(key_to_value, Key) of
         [#key_to_value{type = Type, scope = Scope, value = Value}] -> 
            {ok, {Value, Type, Scope}};
         []                       -> 
            {error, not_found}
      end
   catch
      _Err:Reason -> {error, Reason}
   end.

I pensa Debo haber estado "interceptando" / atrapando el algoritmo de evitación de bloqueo de mnesia en lugar de dejar que vuelva a intentarlo como se diseñó.

¿Es eso posible? Si es así, es un (& ^ & de una trampa para un nuevo bebe como yo. Si no, alguna idea de por qué este código me produjo tantos problemas, pero eliminando las funciones try / catch de mnesia: read, etc. ¿Aclaró todos mis problemas?

Respuestas a la pregunta(1)

Su respuesta a la pregunta