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}])
答案 0 :(得分:1)
您是否使用mnesia:dirty_write
将记录写到表中?
“脏”函数(dirty_read
,dirty_write
等)绕过Mnesia的表碎片,即使像在第一个示例中那样在mnesia:activity
中使用:它们也总是先访问 表的片段。所以我怀疑这是怎么回事:
mnesia:dirty_write
mnesia:dirty_read
在 first 片段中查找了记录,并找到了mnesia:read
中的mnesia:activity
使用记录键的哈希值来找出记录应该所在的片段,并查看该片段-但是该记录不存在,因为它被写入了错误的片段。如果要对碎片表使用脏操作,请用mnesia:activity
或sync_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
确保将记录写入正确的表片段中。