【问题标题】:Using ets mnesia context for read-only operations使用 ets mnesia 上下文进行只读操作
【发布时间】:2014-04-17 21:43:07
【问题描述】:

我有一个 mnesia ram_copies 表复制到所有可用节点。几乎所有使用此表的操作都在脏模式下执行。在ets 上下文中使用mnesia:foldl 会有什么后果?

mnesia:activity(ets, fun() ->
  mnesia:foldl(fun(V, Acc) ->
      case V#my_table.field > 0 of
        true -> Acc;
        false -> Acc + 1
      end
    end, 0, my_table)
end).

【问题讨论】:

    标签: erlang mnesia ets


    【解决方案1】:

    鉴于你有

    • 其他地方的脏事务,因此您不必担心同步
    • ram_copies,因此您不必关心检查点
    • 在所有节点上复制所有表,因此所有读取都是本地的
    • 您只是在阅读,因此不需要通知远程节点

    ets 和 async_dirty 在效果上没有区别。通过绕过async_dirty 所做的大量测试,您可能会看到一些小的速度提升,但我不认为它会带来明显的提升。

    作为一般做法,我建议在任何地方都使用一种事务类型(定义为宏),并且仅在您发现真正的速度改进时才出现分歧。否则,您将面临错误的风险,例如向您的 ets 事务添加写入或违反上述其他假设之一,然后您就会沉没。

    【讨论】:

    • 但是如果我使用事务在ets 上下文中读取会很危险吗?
    • ets 告诉 Mnesia 假设您在单个 ETS 节点上。因此,如果另一个节点锁定了表进行写入,Mnesia 将不遵守锁定,您可能会获得部分读取。这不一定是一场灾难(在您的情况下,读取错误可能是可以的),但是读取同时使用和忽略锁的代码会非常混乱。
    猜你喜欢
    • 2015-07-09
    • 2019-01-09
    • 1970-01-01
    • 2011-01-10
    • 2014-04-15
    • 2013-05-28
    • 2021-09-18
    • 2019-12-05
    • 1970-01-01
    相关资源
    最近更新 更多