我对 mnesia 有一个非常奇怪的错误。我有大约 10 个 mnesia 正在记录的表,通常它工作正常。但是,在我的代码中的某个位置,每当我尝试从特定表中读取(尝试从其他表中读取很好)时,我都会收到 DETS 错误。
我将代码减少到
{atomic, ok} = mnesia:transaction(fun() ->
[Entry] = mnesia:read(table_name, Key),
ok
end)
我在交易周围有一个try
/catch
块,我得到的错误是:
error:{badmatch,
{aborted,
{{badmatch,
{error,
{bad_object_header,
"/path/to/table_name.DAT"}}},
[{callback,
'-handle/2-fun-0-',
1,
[{file,
"src/src.erl"},
{line,
234}]},
{mnesia_tm,
apply_fun,
3,
[{file,
"mnesia_tm.erl"},
{line,
830}]},
{mnesia_tm,
execute_transaction,
5,
[{file,
"mnesia_tm.erl"},
{line,
810}]},
]}}}
不幸的是,我无法通过一个简短的示例重现该错误。即使我从 REPL 调用该函数,它也不会出错。只有在我的实际代码中发生时才会出错。但它确实每次都可靠地发生。
如果我取出mnesia:read
线路,一切正常。我曾尝试重新制作架构和表格,但这并没有帮助。这真的很奇怪,因为我的代码稍后会成功使用该表。只有从这一点使用它才会失败。
可能出了什么问题?
更新
我进行了更多实验,似乎只有当其中两个事务几乎同时发生(在不同的进程中)时才会发生错误。mnesia 不是要以这种方式使用吗?
更新 2
事实证明,通过将我在 Arch Linux 上的 erlang 安装从 R16B-6 降级到 R16B-3,问题得到了解决。希望这个错误很快就会被解决。