我正在学习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输出中推断出这一点。
我怎样才能同步它们,或者说这是一种预期的行为?
当一个人启动一个没有明确指定节点名的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
例子。
更多信息请见 关于远程shell的IEx文档.