【问题标题】:Mnesia in 2 separate IEx sessions on the same nodeMnesia 在同一节点上的 2 个单独的 IEx 会话中
【发布时间】:2017-04-26 15:15:36
【问题描述】:

我正在学习 Erlang 的 mnesia DB 并尝试在 Elixir 应用程序中使用它。根据文档,默认情况下创建模式时,mnesia 会创建一个名为“Mnesia.#{node}”的目录。这是mnesia准备的代码:

:mnesia.create_schema([node])
:mnesia.start
:mnesia.create_table(User,
  [
    attributes: [:name, :email],
    disc_copies: [node]
  ]
)

当我开始 2 个单独的 IEx 会话并进行一些事务性查询时,它们似乎只发生在其中一个会话中。我从 :mnesia.info 输出中推断出这一点。

如何同步它们,或者这是预期的行为?

【问题讨论】:

    标签: erlang elixir mnesia


    【解决方案1】:

    当启动一个没有明确指定节点名的 shell 时,它会以nonode@nohost 启动:

    $ iex
    Erlang/OTP 19 [erts-8.1] [source-e7be63d] ...
    Interactive Elixir (1.5.0-dev) ...
    
    iex(1)> node()
    :nonode@nohost
    

    Mnesia 本身是节点感知的。因此,您需要显式远程连接到节点,即知道运行mnesia。让我们启动一个命名的 shell:

    $ iex --sname mnesia # the node name is arbitrary
    iex(mnesia@localhost)1>
    

    现在,让我们启动第二个 shell 并远程连接到第一个启动的 shell。为此,只需启动一个 shell,然后按 CtrlG 进入User switch command 模式并输入:

    User switch command
    --> r 'mnesia@localhost' 'Elixir.IEx'
    --> c
    

    现在您有两个 shell,连接到同一个节点,用于处理 mnesia 实例。

    the IEx docs on remote shells 中的更多信息。

    【讨论】:

    • 谢谢,我已经尝试过了,它似乎有效。但是如果默认节点是:nonode@nohost,两个IEx会话不应该连接到同一个mnesia实例吗?
    • nonode@nohost 有点无,就像 SQL 中的 NULL。它们不是命名节点。
    猜你喜欢
    • 2017-11-11
    • 2012-04-02
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 2012-10-01
    • 2016-03-12
    相关资源
    最近更新 更多