因此,我在一次交易中对记录集进行CRUD操作时遇到各种麻烦。它导致我在此处发布2个问题,Trouble和MoreTrouble。但是,我认为这两个问题都是由以下原因造成的:在我的事务中,我将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
catch
_Err:Reason -> {error, Reason}
end.
Run Code Online (Sandbox Code Playgroud)
我想我一定是在“拦截” /捕获了Mnesia的避免死锁算法,而不是让它按设计重试。
那可能吗?如果是这样,那么它(对于像我这样的新蜜蜂来说,它是一个加号。解决了我所有的问题?
是的,我不确定在任何地方是否都正确记录了该信息,但是您不应掩盖mnesia操作中的异常。如果这样做的话,即使某些操作实际上根本不起作用,在失忆症中看起来您的交易乐趣也按预期工作了。