mnesia:create_schema/1
在指定的节点列表里初始化一个新的 Mnesia 数据库架构
用法:
1 |
|
在指定的节点列表里的磁盘上初始创建一个新的 Mnesia 数据库架构。在每个节点的本地 Mnesia 目录里会创建各种各样的文件。注意该每个节点的目录必须是唯一的。两个节点可能永远不会共享相同的目录。如果可能的话,使用一个本地磁盘设备来提高性能。
如果给出的任何 Erlang 节点 DiscNodes 不存在,或 Mnesia 服务已经在任何节点里运行,或任何一个节点上已经创建了 Mnesia 的数据库架构,那么 mnesia:create_schema/1 将会创建失败。可以使用 mnesia:delete_schema/1 来清除旧的、有问题的 Mnesia 数据库架构。
1 |
|
mnesia:delete_schema/1
删除给出的节点里 Mnesia 数据库架构
用法:
1 |
|
删除一个由 mnesia:create_schema/1 创建的 Mnesia 数据库架构。如果给出的任何 Erlang 节点 DiscNodes 不存在,或 Mnesia 服务已经在任何节点里运行,那么 mnesia:delete_schema/1 将删除失败。
1 |
|
mnesia:start/0
启动一个本地 Mnesia 系统
用法:
1 |
|
启动一个 Mnesia 节点集群是一个相当复杂的操作过程。一个 Mnesia 系统由一个节点集群组成,这些节点都是会在本地启动 Mnesia 服务的节点。正常情况下,每个节点有一个给 Mnesia 写入文件数据的目录。该目录也将被看作是 Mnesia 服务的目录。Mnesia 也许会启动在一个无磁盘(disc-less)的节点上。于更多关于 Mnesia 无盘节点的信息可以查看 mnesia:create_schema/1 和 Mesia 用户指南。
组成 Mnesia 系统的集群节点是建立在一个架构模式下,并且可以从结构模式里添加或删除 Mnesia。架构模式的初始是用 mnesia:create_schema/1 函数在磁盘上创建。在无盘的节点上,一个极小默认的架构模式会在每次 Mnesia 启动的时候生成。在启动的过程中,节点间的 Mnesia 服务会互相交换架构模式信息,来验证表定义方面的兼容性。
每一个架构模式会有一个唯一的 cookie 来认作是一个唯一架构模式的标示符。该 cookie 必须是 Mnesia 启动的相同所有节点才能运行。关于这方面的更多细节信息可以查看 Mnesia 用户指南。
架构模式文件(同时也是 Mnesia 所需的其他所有文件)是保存在 Mnesia 服务目录里。在命令行里写上 "-mnesia dir Dir",可以用来指定 Mnesia 系统保存数据所在的目录位置。如果命令行不指定,那么目录的命令默认为 "Mnesia.节点名"。
也可以使用 application:start/1 的 application:start(mnesia) 。
1 |
|
mnesia:create_table/2
创建一个 Mnesia 表
用法:
1 |
|
根据参数 TabDef 创建一个名为 Name 的 Mnesia 表。
1 |
|
mnesia:wait_for_tables/2
等待一个 Mnesia 表直到表可以被访问
用法:
1 |
|
一些应用的某些表可能由于表数据很大,以至初始的适合需要一个初始等待的时间才能正常访问到该表的数据。mnesia:wait_for_tables/2 悬停等待一段时间,直到在 TabList 的所有表可以被访问,或超过等待的时间。
下面是等待 5 秒来确认 mnesia_table_name 已经加载:
1 |
|
运行代码
下面是无限等待:
1 |
|
mnesia:stop/0
关停 Mnesia 系统
用法:
1 |
|
关停在当前节点的本地 Mnesia 服务。也可以使用 application:stop/1 的 application:stop(mnesia) 。
1 |
|
mnesia:clear_table/1
永久删除表格Tab的内容。
1 | mnesia:clear_table(Tab). |
mnesia:write/1
调用函数write(Tab, Record, write),如果新建的记录和数据表里的某一行具有相同的主键,就会覆盖那一行,否则就会创建一个新行。
用法:
1 |
|
mnesia:write/3
将记录Record写入表Tab。
该函数返回ok,或者在发生错误时终止。例如,如果不存在该表,则事务终止。
mnesia:transaction/1
写过程
transaction:普通事务,数据更新满足事务的 ACID 特性,也会同步扩散到所有包含数据副本的mnesia结点,但事务提交时不要求各个副本结点的日志存储在磁盘上;
在事务内部执行的代码可以由一系列表操作功能组成。如果由于用户错误或某个表不可用而导致事务内部出现问题,则整个事务将终止,函数 transaction / 1返回元组 {aborted,Reason}。如果一切顺利,则返回{atomic,ResultOfFun},其中ResultOfFun是Fun中最后一个表达式的值。
用法:
1 |
|
mnesia:delete/1
移除某一行,要移除某一行,需要知道该行的对象Id(Object,简称OID)。它由表名和主键的值构成
用法:
1 |
|
mnesia:read/2
返回记录
1 |
|
调用函数mnesia : read ( Tab, Key, read)
mnesia:read/3
返回记录
使用键Key从表Tab读取所有记录。无论Tab的位置如何,此函数具有相同的语义。如果表的类型为bag,则函数 mnesia:read(Tab,Key)可以返回任意长的列表。如果表是set类型的 ,则列表的长度为1或[]。
该函数的语义是上下文相关的。有关详细信息,请参见mnesia:activity / 4。在事务上下文中,它获取类型为LockKind的锁 。当前,支持锁类型read, write和sticky_write。
如果用户想要更新记录,它可以更有效地使用写/ sticky_write作为 LockKind。如果多数检查在该表上处于活动状态,则在尝试写锁定时将对其进行检查。如果不满足多数条件,则可用于快速结束。
1 |
|
mnesia:abort/1
事务返回
事务默认返回元组{aborted,Reason}。Mnesia事务的终止意味着对封闭的catch抛出异常。因此,表达式catch mnesia:abort(x)不会终止事务。
当这个事务失败时(即调用mnesia:abort(Reason)时),mnesia:write所做的更改都会被撤销,数据库恢复到了进入事务之前的状态。
1 |
|