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?