
_START_ARTICLE_
Mnesia
_START_SECTION_
描述
_START_PARAGRAPH_
Mnesia 与 Erlang 都是爱立信公司为与电信相关的软实时分布式高可用的计算工作而开发的。它既不是为了通用办公型数据处理设计的数据库管理系统。也无意于替代基于SQL 语言的系统。它是为了帮助Erlang 实现数据管理系统类的数据持久化而存在的。比起带有SQL的数据库服务器，它与像Berkeley DB 这样的嵌入式数据库管理系统更相似。
_START_SECTION_
数据库模型
_START_PARAGRAPH_
表中的“行”代表了包含一个键值以及一个数据域的记录。这条数据域可能是一个包含任意复杂形式的Erlang 数据结构的元组。
_START_SECTION_
关系型特性
_START_PARAGRAPH_
数据库模型是关系型的，但它并不是用大家比较熟悉的SQL 操作的。一个数据库中的多个表可以在互相之间构建联系。_NEWLINE_Mnesia 高可用的一个关键特性就在于数据库中的表可以重新配置，并且可以在节点之间互相迁移。你不仅可以在数据库运行的时候这样操作，甚至还可以在数据库正在读写的时候操作。
_START_SECTION_
编码
_START_PARAGRAPH_
Mnesia 的查询语言不是 SQL 语言，而是Erlang 本身。这也意味着它可以让开发者直接使用erlang 语言的特性来表达事务，开发者可以仅仅使用一个语言开发一个完整的应用程序。
_START_SECTION_
事务
_START_PARAGRAPH_
Erlang 是函数式编程语言。Mnesia 正是基于这一点来做到ACID 事务的。作为事务运行的函数块仅仅只是一个非常普通的被称为函数对象的Erlang 构造体。写成单条Mnesia 语句为mnesia:transaction(F)。 这样一来就可以使源代码变得要比SQL 的 BEGIN / COMMIT 配对的语法更清晰，同时也避免了在过程中没有关闭事务的问题。_NEWLINE_又因为Erlang 的函数式特性，嵌套事务也非常简单。也可以在多个结点（也就是单独的服务器）里发布事务。以这种方式使用事务可以让语义保持一致，同时也让编写库代码在上下文保持一致的效果。_NEWLINE_Mnesia 的一般编码风格是总是使用事务。考虑到性能问题，Mnesia 也支持用户使用“脏操作”来避免使用事务。这些操作虽然是对ACID 原子性以及隔离性的妥协，但也提供了大概10倍的吞吐量。除此以外，它还提供了将数据存储在内存中的选项，然而这么做会丢失ACID 的持久性。
_START_SECTION_
有效执行
_START_PARAGRAPH_
Mnesia 是 LYME web 应用程序栈的一部分。这与LAMP 类似，但它是基于Erlang。用 Erlang实现会带来一个效率上的好处，那就是开发出来的应用程序自始至终是运行在单个虚拟机上的。LYME 充分利用了这一点，因为连Yawsweb 服务器都是由Erlang 实现的。_NEWLINE_地址空间在数据与代码之间都是共享的（在 Erlang 语言中，这样做是安全的。），包括 Mnesia 的表数据。
_START_SECTION_
起源和许可
_START_PARAGRAPH_
Mnesia 和 Erlang 都是爱立信计算机科学实验室开发的。他们都是作为开源软件发布的。Mnesia 是基于Mozilla公共许可证的衍生版发布的。他们都是根据开源Erlang 公共许可证发行的。
_START_SECTION_
ejabberd
_START_PARAGRAPH_
将 Mnesia 嵌入到基于Erlang 的 Jabber 守护进程ejabberd 也是一个选项。