erlang 中 mnesia 的使用实例

来源:互联网 发布:xquartz for mac下载 编辑:程序博客网 时间:2024/05/21 06:15

http://www.cnblogs.com/ShankYan/p/4120058.html

参考资料:
mnesia 用户手册相关的微博
mnesia 应用例子一个

关于mnasia:

  1. 数据库启动
    启动的时候指向一个特定的数据库:
    erl -mnesia dir '"Dir"'指定了Mnesia存储数据的目录,
    windows下可以是erl -mnesia dir 'Dir'
    DBMS通过mnesia:start()启动
    数据库停止
    mnesia:stop()
    可以通过mnesia:info()查看数据库状态
  2. 创建数据表
    -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).

  1. 数据表的读取一条记录
    Oid = {muppet, arm },
    mnesia:read(Oid).

  2. 数据表的删除一条记录
    要想删除一行,需要知道这一行数据的目标OID,
    OID由表的名称和主键值决定
    Oid = {muppet, arm }
    F=fun()->mnesia:delete(Oid) end
    mnesia:transaction(F).

  3. 事务
    mnesia:transaction(Fun)表示Fun位于一个事务中:
    1)Fun要么完全成功要么完全失败
    2)操作同样数据record的代码可以并行运行,不同的进程不会相互干扰
    事务具有原子性。
    调用mnesia:abort(Reason) 取消一个事务,数据库恢复到进入事务
    之前的状态。

  4. 脏操作
    有时在事务的范围以外而且没有设置任何锁来执行一次操作,是可以接
    受的这种操作成为脏操作,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用户手册的阅读总结

0 0
原创粉丝点击