erlang - significado - Interceptar involuntariamente los intentos de transacción de Mnesia con resultados de prueba/captura en todo tipo de rarezas
mnesia elixir (1)
Sí, no estoy seguro de si está debidamente documentado en alguna parte, pero no debe enmascarar las excepciones en las operaciones de mnesia. Si lo haces, a mnesia le parece que la diversión de tus transacciones funcionó según lo previsto, aunque algunas operaciones en realidad no funcionaron en absoluto.
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í, Trouble and MoreTrouble . Sin embargo , creo que ambos problemas fueron creados por lo siguiente: Dentro de mis transacciones, encerré mi mnesia: escribe, lee, etc. en try / catch blocks que captaron todo, incluidas las transacciones abortadas de mnesia como parte de su algoritmo de prevención de interbloqueo. Es decir,
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
fin
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.
Creo que debo haber estado "interceptando" / atrapando el algoritmo de evitación de bloqueo muerto de mnesia en lugar de permitir que vuelva a intentarlo según lo diseñado.
¿Es eso posible? Si es así, es un (& ^ & de un pijo-a para un bebe nuevo como yo. Si no, alguna idea de por qué este código me produjo tantos problemas, pero quitando el try / catch de las funciones mnesia: read, etc. aclarado todos mis problemas?