zoukankan      html  css  js  c++  java
  • erlang 中 mnesia 的使用实例

    参考资料:
    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用户手册的阅读总结

  • 相关阅读:
    挑战练习13.8 用于RecyclerView 的空视图
    挑战练习13.7 复数字符串资源
    挑战练习13.6 删除crime 记录
    挑战练习12.3 更多对话框
    20. Valid Parentheses
    挑战练习11.6 添加Jump to First按钮和Jump to Last按钮
    内存 分析
    HOOK64 32转换
    MD5
    HOOk快捷键
  • 原文地址:https://www.cnblogs.com/ShankYan/p/4120058.html
Copyright © 2011-2022 走看看