代码之家  ›  专栏  ›  技术社区  ›  Zed

异步事务

  •  3
  • Zed  · 技术社区  · 15 年前

    据我所知,Mnesia的默认行为是在执行写操作之前同步获取所有节点上的锁。这将导致高延迟,特别是对于地理上分布的节点。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Christian    15 年前

    我认为,如果您使用消息队列系统(可能是rabbitmq)自己从消息队列提要更新复制的db来构建这种非现场复制,您会更高兴。广域网链路更可能出现拥塞或故障,消息队列协议有办法解决这一问题。Erlang发行版放弃了,您必须将更新溢出到一个文件中,直到复制副本出现并可以使用它。

    为了获得最佳对称性,将发布到消息队列作为更新数据库的主要方法。因此,即使是主机也会通过从消息队列中消费来更新。如果需要响应,当前主机可以将消息发送回消息的颁发者。

    记忆有几种不同的记忆方式 mnesia transaction contexts

        2
  •  1
  •   pls    14 年前

    也许您的应用程序可以从使用粘性锁中获益。我想这很接近你的需要,但是…不完全是你想要的 http://www.erlang.org/documentation/doc-5.8.3/lib/mnesia-4.4.17/doc/html/Mnesia_chap4.html#id70700

        3
  •  0
  •   emvee    15 年前

    有趣的Q和同样有趣的A!

    基本上,Christian,你的建议是,例如,拥有一个gen_服务器——序列化对数据库的访问。 我第一次这么做,然后我意识到:坚持住!Mnesia是事务性的,所以首先序列化访问,然后通过事务更新数据库,这听起来有点奇怪。

    我知道这并不是对你问题的直接回答,但是,我要说的是使用mnesia+memorynodes+disknodes。用于快速接管的memorynodes和用于崩溃/备份后恢复的disknodes。

    嗯,, 哈维