相关疑难解决方法(0)

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

因此,我在一次交易中对记录集进行CRUD操作时遇到各种麻烦。它导致我在此处发布2个问题,TroubleMoreTrouble但是,我认为这两个问题都是由以下原因造成的:在我的事务中,我将mnesia:writes,reads等包含在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
Run Code Online (Sandbox Code Playgroud)

结束

例如,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 …
Run Code Online (Sandbox Code Playgroud)

erlang mnesia

3
推荐指数
1
解决办法
470
查看次数

标签 统计

erlang ×1

mnesia ×1