mnesia 和mysql 同步_mnesia

标签:

1、schema 表

Mnesia系统的配置在schema里描述

schema是一个特殊的表,它包含了表名、每个表的存储类型(表应该存储为RAM、硬盘或两者)以及表的位置等信息

schema表的信息只能通过schema的方法来操作

1)mnesia:create_schema(NodeList)

该方法用来初始化一个新的空schema,在Mnesia启动之前这是一个强制必要的步骤

Mnesia是一个完全分布的DBMS,而schema是一个系统表,它备份到Mnesia系统的所有节点上

如果NodeList中某一个节点已经有schema,则该方法会失败

该方法需要NodeList中所有节点上的Mnesia都停止之后才执行

应用程序只需调用该方法一次,因为通常只需要初始化数据库schema一次

2)mnesia:delete_schema(DiscNodeList)

该方法在DiscNodeList节点上擦除旧的schema,它也删除所有的旧table和数据

该方法需要所有节点上的Mnesia都停止后才执行

1)、schema只能创建一次

2)、实际上,每个节点都保存一份schema拷贝

2、普通表的操作

mnesia:create_table(funky, []).

mnesia:delete_table(Tab).

mnesia:clear_table(Tab).

mnesia:move_table_copy(Tab, From, To).将表Tab从From拷贝到To节点。

mnesia:add_table_copy(Tab, Node, Type).在node节点上创建Tab的备份.

mnesia:del_table_copy(Tab, Node).在node节点删除Tab的备份,最后一个备份被删掉后,表本身也被删掉。

mnesia:transform_table(Tab, Fun, NewAtrributeList, NewRecordName)改变表的记录格式。

mnesia:change_table_copy_type(Tab, Node, ToType)修改表的存储类型.

mnesia:info().

mnesia:write().

mnesia:transaction().

mnesia:table_info(Tab, Key).

mnesia:system_info(Key).

在一个节点上,通过 mnesia:create_table(),则创建一个分布式的表。

mnesia会自动将该表同步到节点中其它节点上。

每个节点,实际上还是维护的本地的一个表。

在任意一个节点上进行如上操作,都会同步反映到集群中的其它节点上。

事务是同步的操作,性能低,但能确保一致性。

脏操作不能保证一致性,但是速度极快。

3、mnesia数据模型

Mnesia的数据库数据由record组成,record由tuple表示

record的第一个元素是record名,第二个元素是表的key,前两个元素组成的tuple称为oid

Mnesia数据模型是对关系模型的扩展,因为该模型可以在域属性里存储任意的Erlang term

例如,可以在一个属性里存储指向其他表里的oid树,而这种类型的记录在传统的关系型DBMS里很难建模

mnesia数据库被组织为一个表的集合,每个表有实例构成,表也包含一些属性,如位置和持久性。

在mnesia里,表内所有记录必须有相同的名字,所有记录必须是同一记录类型的实例。

存储类型为RAM_copies和disc_copies的Mnesia表内部是用ets表来实现的,因此,应用程序直接存取这些ets表是可能的。

一个在记录中的单独字段能够包含任何类型的复合数据结构。

对象ID 由表名和Key组成。如记录{employee, 10347, klacke, 7, male, 9810, {221, 015}}的Oid就是{employee, 10347}.

4、启动mnesia

在启动Mnesia之前我们必须在相应的节点上初始化一个空的schema

1)Erlang系统必须启动

2)必须使用create_schema(NodeList)来定义数据库schema

当运行一个分布式系统时,可能有多个节点参与,则mnesia:start()方法必须在相应的节点上运行

数据库只需初始化一次,下次只需mnesia:start()启动即可从硬盘启动系统

mnesia:stop()方法在当前节点上停止Mnesia,start/0和stop/0都在本地Mnesia系统上起作用,没有启动和停止一些节点的方法

mnesia:wait_for_table(TabList, Timeout)会等待表的加载

5、mnesia数据查询

1) Mnesia方法

2) QLC

通过key来遍历表   APIs:

mnesia:dirty_first(Tab) 返回Tab中第一个Key, 如果表中没有记录,返回‘$end_of_table‘

mnesia:dirty_next(Tab, Key) 返回Tab中的下一个Key, 如果表中没有下一个key,返回‘$end_of_table‘

mnesia:dirty_last(Tab) 和mnesia:dirty_first(Tab)工作方式一样,只有当type是ordered_set的时候

返回Erlang排序中的最后一项,其它类型的和mnesia:dirty_first(Tab)完全一样.

mnesia:dirty_prev(Tab, Key) 和mnesia:dirty_next(Tab, Key)工作方式一样,只有当type是ordered_set的时候

返回Erlang排序中的前一项,其它类型的和mnesia:dirty_next(Tab, Key)完全一样

6、Mnesia四种常用的锁

读锁,写锁,读表锁,写表锁

读表锁: 如果事务要扫描整张表来获取记录,对表里的一条条记录加锁效率也很低也很耗内存,因此,可以

对这张表设置一个读表锁.

写表锁: 要写大量的记录到表里,可以设置写表锁.

Mnesia锁的策略是在读取一条记录的时候,锁住该条记录;在写一条记录的时候锁住记录的所有副本

写锁一般会要求在所有存放表的副本并且是活动的节点上设置,读锁只设置一个节点.

标签:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值