使用try / catch无意中拦截Mnesia的事务重试会导致各种怪异

时间:2011-11-11 20:00:02

标签: erlang mnesia

所以,我在一次交易中对记录集的CRUD操作遇到了各种各样的麻烦。它引导我在这里发布2个问题,TroubleMoreTrouble然而,我认为这些问题都是由以下内容创建的:在我的交易中,我附上了我的mnesia:写入,读取等等在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

例如,

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的死锁避免算法,而不是让它按设计重试。

这可能吗?如果是这样的话,它就是一个像我一样的新手。如果没有,任何想法为什么这个代码为我产生了这么多问题,但是从mnesia中删除了try / catch:read等等。函数清除了我的所有问题?

1 个答案:

答案 0 :(得分:5)

是的,我不确定这是否在任何地方都有适当的记录,但你不应该掩盖mnesia操作中的异常。如果你这样做,它看起来就像你的交易乐趣按预期工作,即使某些操作实际上根本不起作用。