参考资料:
mnesia 用户手册相关的微博
mnesia 应用例子一个
关于mnasia:
- 数据库启动
启动的时候指向一个特定的数据库:
erl -mnesia dir '"Dir"'指定了Mnesia存储数据的目录,
windows下可以是erl -mnesia dir 'Dir'
DBMS通过mnesia:start()启动
数据库停止
mnesia:stop()
可以通过mnesia:info()查看数据库状态 - 创建数据表
-record(muppet, {name,
callsign,
salary}).
mnesia:create_table(Name, ArgList)用来创建表
Name是表名,
mnesia:create_table(muppet, [{attributes, record_info(fields, muppet)}])
记录中的字段名就是数据表的各个字段,默认情况下主键是记录的第一个元素,
每一条记录的实例成为一个对象,对象表名和主键作为对象标识符
常见的属性:
{type, Type} ->Type 可以是set, ordered_set, bag
{disc_copies/ram_copies/disc_only_copies, [node(), someOtherNode()]}
3.数据表的插入一条记录
Test= #muppet{name= arm,
callsign = huhu,
salary = 70},
F=fun()->mnesia:write(Test) end
mnesia:transaction(F).
-
数据表的读取一条记录
Oid = {muppet, arm },
mnesia:read(Oid). -
数据表的删除一条记录
要想删除一行,需要知道这一行数据的目标OID,
OID由表的名称和主键值决定
Oid = {muppet, arm }
F=fun()->mnesia:delete(Oid) end
mnesia:transaction(F). -
事务
mnesia:transaction(Fun)表示Fun位于一个事务中:
1)Fun要么完全成功要么完全失败
2)操作同样数据record的代码可以并行运行,不同的进程不会相互干扰
事务具有原子性。
调用mnesia:abort(Reason) 取消一个事务,数据库恢复到进入事务
之前的状态。 -
脏操作
有时在事务的范围以外而且没有设置任何锁来执行一次操作,是可以接
受的这种操作成为脏操作,Mnesia中,脏操作的速度比在事务中执行的
速度快大约十倍,在可以保证表一致性,隔离性,持久性,以及分布式
特性,脏操作可以大大提高程序性能
dirty_read({表名,主键})
dirty_write(记录名)
dirty_delete({表名,主键})
这些操作和事务中执行操作一样
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%mnesia:start().//启动
rd(muppet, {name, callsign, salary}).//创建记录用于创建数据库
mnesia:create_table(muppet, [{attributes, record_info(fields, muppet)}]).//创建数据库表
mnesia:table_info(muppet, attributes). //以列表形式获取数据表的各个字段名称
[name,callsign,salary]
mnesia:dirty_write(#muppet{name="sh",callsign="dsf",salary=9}).//写入一个记录
mnesia:table_info(muppet,size)
1
mnesia:table_info(muppet,type).
set
mnesia:dirty_all_keys(muppet).
["sh"]
mnesia:dirty_read(muppet,"sd").
[#muppet{name = "sd",callsign="dsf",salary=9}]
mnesia:dirty_write(#muppet{name=ssd,callsign=dsf,salary=9}).
mnesia:dirty_read(muppet,ssd).
[#muppet{name = ssd,callsign=dsf,salary=9}]
mnesia:dirty_all_keys(muppet).//记录的各个主键名称
["sd",ssd]
mnesia:table_info(muppet,size)//记录的个数
2
mnesia:table_info(muppet, record_name).
muppet
mnesia:add_table_copy(Tab, Node, Type).
创建一个复件表在Node节点上。Type只能是原子ram_copies,disc_copies, disc_only_copies之一。
假如我们添一个schema系统表复件到一个节点, 这样就扩展了mnesia系统的节点数
node()
mnesia:add_table_copy(muppet,node(),ram_copies).
{aborted,{already_exists,muppet,nonode@nohost}}
mnesia:add_table_copy(muppet,my@debian,ram_copies).
{atomic,ok}
17> mnesia:add_table_copy(muppet,my@debian,ram_copies).
{aborted,{already_exists,muppet,my@debian}}
也可以这样创建数据表,但是这个之后怎么用是一个问题
mnesia:create_table(muppet,[{attributes,[person, phone, salary]}]).
{atomic,ok}
相关资料:
mnesia用户手册的阅读总结