【问题标题】:mnesia:read return empty when use table fragmentation in mnesia , but have recordmnesia:read 在 mnesia 中使用表碎片时返回空,但有记录
【发布时间】:2019-06-04 08:37:09
【问题描述】:

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

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

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

    “脏”函数(dirty_readdirty_write 等)绕过 Mnesia 的表碎片,即使在 mnesia:activity 中使用,如您的第一个示例:它们总是访问 first 的片段桌子。所以我怀疑发生的事情是这样的:

    • 记录已使用mnesia:dirty_write 写入第一个片段
    • 在您的第一个示例中,mnesia:dirty_readfirst 片段中查找记录,并找到了它
    • 在您的第二个示例中,mnesia:readmnesia:activity 使用记录键的哈希来确定记录应该在哪个片段中,并查看该片段 - 但记录是不存在,因为它被写入了错误的片段。

    如果您想对碎片表使用脏操作,请使用sync_dirtyasync_dirty 调用mnesia:activity

    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 确保记录被写入正确的表片段。

    【讨论】:

    • 感谢您的回复!如何写记录使用记录键的散列来分片?
    • 我在答案中添加了一个例子。
    猜你喜欢
    • 2015-08-26
    • 2012-10-11
    • 2012-08-26
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2018-01-19
    • 2017-01-14
    • 2017-10-15
    相关资源
    最近更新 更多