gpt4 book ai didi

erlang - 使用 try/catch 无意中拦截 Mnesia 的事务重试会导致各种奇怪的情况

转载 作者:行者123 更新时间:2023-12-02 05:48:13 27 4
gpt4 key购买 nike

因此,我在一次事务中对记录集进行 CRUD 操作时遇到了各种麻烦。这导致我在这里发布 2 个问题,TroubleMoreTrouble但是,我认为这两个问题都是由以下原因造成的:在我的事务中,我将 mnesia:writes、reads 等包含在 try/catch block 中,这些 block 捕获了所有内容,包括 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:read 等函数中删除了 try/catch解决了我所有的问题吗?

最佳答案

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

关于erlang - 使用 try/catch 无意中拦截 Mnesia 的事务重试会导致各种奇怪的情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8099261/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com