mnesia:在mnesia中使用表碎片时,read返回空,但有记录

时间:2019-01-09 14:28:36

标签: erlang mnesia

mnesia:read在mnesia中使用表碎片时会返回一个空列表,但我确实有一条记录:

我的代码是这样的:

F = fun() ->
     mnesia:dirty_read({offline_msg, <<0,0,0,0,0,0,0,11>>}) 
end.
Result = mnesia:activity(transaction, F, [],mnesia_frag).
Result is : 
[#offline_msg{userid = <<0,0,0,0,0,0,0,11>>,timestamp =1547039796317984,from = 123}]

但是

F = fun() -> 
    mnesia:read({offline_msg, <<0,0,0,0,0,0,0,11>>}) 
end.
Result = mnesia:activity(transaction, F, [],mnesia_frag).

Result is  []

表格信息:

PrimProps = [{n_fragments, 64}, {n_disc_only_copies, 1}, {node_pool, [node()]}],
mnesia:create_table(offline_msg,
 [{disc_only_copies, [node()]},{type, bag},{attributes, record_info(fields, offline_msg)}, {frag_properties, PrimProps}])

1 个答案:

答案 0 :(得分:1)

您是否使用mnesia:dirty_write将记录写到表中?

“脏”函数(dirty_readdirty_write等)绕过Mnesia的表碎片,即使像在第一个示例中那样在mnesia:activity中使用:它们也总是先访问 表的片段。所以我怀疑这是怎么回事:

  • 使用mnesia:dirty_write
  • 将记录写入 first 片段
  • 在您的第一个示例中,mnesia:dirty_read first 片段中查找了记录,并找到了
  • 在您的第二个示例中,mnesia:read中的mnesia:activity使用记录键的哈希值来找出记录应该所在的片段,并查看该片段-但是该记录不存在,因为它被写入了错误的片段。

如果要对碎片表使用脏操作,请用mnesia:activitysync_dirty调用async_dirty

mnesia:activity(sync_dirty, F, [],mnesia_frag).

例如,将记录写入表:

OfflineMsg = #offline_msg{...},
F = fun() -> mnesia:write(OfflineMsg) end,
mnesia:activity(sync_dirty, F, [],mnesia_frag).

这将使mnesia_frag确保将记录写入正确的表片段中。