Erlang Mnesia数据库模块

mnesia:create_schema/1

在指定的节点列表里初始化一个新的 Mnesia 数据库架构

用法:

1

create_schema(DiscNodes) -> ok | {error,Reason}

在指定的节点列表里的磁盘上初始创建一个新的 Mnesia 数据库架构。在每个节点的本地 Mnesia 目录里会创建各种各样的文件。注意该每个节点的目录必须是唯一的。两个节点可能永远不会共享相同的目录。如果可能的话,使用一个本地磁盘设备来提高性能。

如果给出的任何 Erlang 节点 DiscNodes 不存在,或 Mnesia 服务已经在任何节点里运行,或任何一个节点上已经创建了 Mnesia 的数据库架构,那么 mnesia:create_schema/1 将会创建失败。可以使用 mnesia:delete_schema/1 来清除旧的、有问题的 Mnesia 数据库架构。

1

mnesia:create_schema([node()]).


mnesia:delete_schema/1

删除给出的节点里 Mnesia 数据库架构

用法:

1

delete_schema(DiscNodes) -> ok | {error,Reason}

删除一个由 mnesia:create_schema/1 创建的 Mnesia 数据库架构。如果给出的任何 Erlang 节点 DiscNodes 不存在,或 Mnesia 服务已经在任何节点里运行,那么 mnesia:delete_schema/1 将删除失败。

1

mnesia:delete_schema([node()]).


mnesia:start/0

启动一个本地 Mnesia 系统

用法:

1

start() -> ok | {error, Reason}

启动一个 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:start().


mnesia:create_table/2

创建一个 Mnesia 表

用法:

1

create_table(NameTabDef) -> {atomic, ok} | {aborted, Reason}

根据参数 TabDef 创建一个名为 Name 的 Mnesia 表。

1

mnesia:create_table(mnesia_table_name, [{ram_copies, [node()]}, {disc_only_copies, nodes()}, {storage_properties, [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}]).


mnesia:wait_for_tables/2

等待一个 Mnesia 表直到表可以被访问

用法:

1

wait_for_tables(TabList,Timeout) -> ok | {timeout, BadTabList} | {error, Reason}

一些应用的某些表可能由于表数据很大,以至初始的适合需要一个初始等待的时间才能正常访问到该表的数据。mnesia:wait_for_tables/2 悬停等待一段时间,直到在 TabList 的所有表可以被访问,或超过等待的时间。

下面是等待 5 秒来确认 mnesia_table_name 已经加载:

1

mnesia:wait_for_tables([mnesia_table_name], 5000).

运行代码

下面是无限等待:

1

mnesia:wait_for_tables([mnesia_table_name], infinity).


mnesia:stop/0

关停 Mnesia 系统

用法:

1

stop() -> stopped

关停在当前节点的本地 Mnesia 服务。也可以使用 application:stop/1 的 application:stop(mnesia) 。

1

mnesia:stop().


mnesia:clear_table/1

永久删除表格Tab的内容。

1

mnesia:clear_table(Tab). 


mnesia:write/1

调用函数write(Tab, Record, write),如果新建的记录和数据表里的某一行具有相同的主键,就会覆盖那一行,否则就会创建一个新行。

用法:

1

mnesia:write(Record)


mnesia:write/3

将记录Record写入表Tab。

该函数返回ok,或者在发生错误时终止。例如,如果不存在该表,则事务终止。


mnesia:transaction/1

写过程

transaction:普通事务,数据更新满足事务的 ACID 特性,也会同步扩散到所有包含数据副本的mnesia结点,但事务提交时不要求各个副本结点的日志存储在磁盘上;

在事务内部执行的代码可以由一系列表操作功能组成。如果由于用户错误或某个表不可用而导致事务内部出现问题,则整个事务将终止,函数 transaction / 1返回元组 {aborted,Reason}。如果一切顺利,则返回{atomic,ResultOfFun},其中ResultOfFunFun中最后一个表达式的值。

用法:

1

mnesia:transaction(F)


mnesia:delete/1

移除某一行,要移除某一行,需要知道该行的对象Id(Object,简称OID)。它由表名和主键的值构成

用法:

1

mnesia:delete(Oid)


mnesia:read/2

返回记录

1

mnesia:read({Tab, Key})

调用函数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:delete(Oid)


mnesia:abort/1

事务返回

事务默认返回元组{aborted,Reason}。Mnesia事务的终止意味着对封闭的catch抛出异常。因此,表达式catch mnesia:abort(x)不会终止事务。

当这个事务失败时(即调用mnesia:abort(Reason)时),mnesia:write所做的更改都会被撤销,数据库恢复到了进入事务之前的状态。

1

mnesia:abort(Reason) 


 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我之前提到的`mnesia:write/1`函数是不正确的。 在Mnesia中,`mnesia:write/3`函数用于将数据写入到Mnesia数据库中的指定表中。它接受三个参数:表名、记录和写选项。 以下是使用`mnesia:write/3`函数的一般步骤: 1. 确保Mnesia数据库已启动:在使用`mnesia:write/3`函数之前,请确保Mnesia数据库已经启动并且相关表已创建。 2. 定义记录:创建一个记录,包含要插入或更新到Mnesia表中的数据。记录是一个以元组形式表示的数据结构。 3. 调用`mnesia:write/3`函数:使用`mnesia:write/3`函数将记录写入到Mnesia表中。例如: ```erlang Record = {table_name, Key, Value}, ok = mnesia:write(table_name, Record, write). ``` 在上面的示例中,`table_name`是要写入的Mnesia表的名称,`Key`是记录的主键,`Value`是要写入的数据。 第三个参数是写选项,可以指定为以下之一: - `write`:执行插入或更新操作。 - `write_dirty`:执行脏写操作,不关心事务。 - `write_concurrency`:执行并发写操作。 4. 错误处理:根据需要进行错误处理。如果写入操作失败,`mnesia:write/3`函数会抛出一个异常。 需要注意的是,`mnesia:write/3`函数将数据写入到内存中的Mnesia副本,并不会立即持久化到磁盘。如果需要将数据持久化到磁盘,可以使用`mnesia:transaction/1`函数包裹写操作,并在事务结束时调用`mnesia:commit/1`函数。 这只是一个简单的示例,实际使用中可能需要更复杂的逻辑和数据操作。建议参考ErlangMnesia的官方文档以获取更详细的信息和示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值