erlang - mnesia:read 在 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}])
解决方案
您是否使用 将记录写入表mnesia:dirty_write
?
“脏”函数(dirty_read
等dirty_write
)绕过了 Mnesia 的表碎片,即使mnesia:activity
在你的第一个示例中使用内部:它们总是访问表的第一个片段。所以我怀疑发生的事情是这样的:
- 记录被写入第一个片段使用
mnesia:dirty_write
- 在您的第一个示例中,在第一个片段
mnesia:dirty_read
中查找记录,并找到它 - 在您的 secord 示例中,
mnesia:read
insidemnesia:activity
使用了记录键的哈希来确定记录应该在哪个片段中,并查看该片段 - 但记录不存在,因为它被写入了错误的片段。
如果要对碎片表使用脏操作,请mnesia:activity
使用sync_dirty
or调用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
确保记录被写入正确的表片段。
推荐阅读
- sql - 使用 sql 脚本使用当前数据预测未来数据趋势,并将它们绘制在 SSRS 上
- mysql - 将数据库中的数据填充到选择保管箱中
- javascript - 将PHP变量分配给JavaScript变量,值正在消失
- javascript - Javascript:如何在不同的线程中运行异步函数?
- php - PHP通过键的特定开始对数组进行排序/重新排序
- php - PHP致命错误:超过-1秒的最大执行时间
- python - 用 Python 编写的列表中的搜索列表
- python - 在python3中将嵌套对象插入mongodb(嵌套对象是一个类实例)
- android - 我可以这样管理颜色资源吗?
- angular - 检查数组打字稿中的特定值