Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang mnesia:在mnesia中使用表碎片时读取返回空,但有记录_Erlang_Mnesia - Fatal编程技术网

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

Erlang mnesia:在mnesia中使用表碎片时读取返回空,但有记录,erlang,mnesia,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,

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}]

您是否使用mnesia:dirty\u write将记录写入表中

脏函数dirty_read、dirty_write等绕过了Mnesia的表碎片,即使在Mnesia:activity中使用,如第一个示例所示:它们始终访问表的第一个碎片。所以我怀疑发生的事情是这样的:

使用mnesia:dirty_write将记录写入第一个片段 在第一个示例中,mnesia:dirty_read在第一个片段中查找记录,并找到了它 在您的secord示例中,mnesia:read inside mnesia:activity使用记录键的散列来确定记录应该在哪个片段中,并在该片段中查找,但该记录不存在,因为它被写入了错误的片段。 如果要对碎片表使用脏操作,请调用mnesia:activity with sync\u dirty或async\u dirty:

例如,要将记录写入表,请执行以下操作:

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

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

感谢您的回复!如何使用记录键的散列来编写记录片段?我在答案中添加了一个例子。
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}])
mnesia:activity(sync_dirty, F, [],mnesia_frag).
OfflineMsg = #offline_msg{...},
F = fun() -> mnesia:write(OfflineMsg) end,
mnesia:activity(sync_dirty, F, [],mnesia_frag).