Итак, у меня были всевозможные проблемы с операциями CRUD над наборами записей в одной транзакции.Это заставило меня опубликовать 2 вопроса здесь: Trouble и MoreTrouble . Однако , я думаю, что обе эти проблемы были созданы следующим образом: В своих транзакциях я заключил мою мнезию: записи, чтения и т. Д. В блоки try / catch, которые перехватывали все, включая прерванные транзакции mnesiaкак часть его алгоритма предотвращения тупиковых ситуаций. Т.е.
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
end
sc: lookup / 1, например, выглядело так:
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.
Я думаю Я, должно быть, "перехватывал" / ловил алгоритм предотвращения тупика mnesia вместо того, чтобы позволить ему повторить попытку, как задумано.
Возможно ли это?Если это так, то это (& ^ & of the getch-a для новичка, подобного мне. Если нет, то есть идеи, почему этот код доставил мне столько проблем, но убрал функции try / catch из mnesia: read и др. Функциипрояснил все мои проблемы?