Непреднамеренный перехват транзакционных попыток Mnesia с результатами try / catch во всех видах странностей - PullRequest
3 голосов
/ 12 ноября 2011

Итак, у меня были всевозможные проблемы с операциями 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 и др. Функциипрояснил все мои проблемы?

1 Ответ

5 голосов
/ 12 ноября 2011

Да, я не уверен, что это где-то правильно задокументировано, но вы не должны маскировать исключения в операциях mnesia.Если вы сделаете это, Mnesia будет выглядеть так, как будто ваши транзакции доставили удовольствие, как и планировалось, даже если некоторые операции вообще не работали.

...