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:dirty_read({Tab, Key}),
mnesia:dirty_write(Record)
mnesia:dirty_delete({Tab,Key})
mnesia:dirty_delete_object(Record)
mnesia:dirty_firest(Tab)
mnesia:dirty_next(Tab, key)
mnesia:dirty_last(Tab)
mnesia:dirty_prev(Tab, Key)
mnesia:dirty_slot(Tab, Slot)
mnesia:dirty_update_counter({Tab, Key}, Val)
mnesia:dirty_match_object(Pat)
mnesia:dirty_index_match_object(Pat, Pos)
mnesia:dirty_all_key(Tab)
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)完全一样读锁, 在复制记录读前加读锁
写锁, 在事务写记录前,会在指定记录的所有复件上添加写锁 读表锁,如果一个事务遍历整个表搜索指定条件记录,最低效是设置记录锁,同时也是大量内存消耗。些时可以指定一个读表锁。 写表锁,如果一个事务要大量写入一个表,最好你用写表锁 粘锁,当一个事务操作完成后,锁依然存在。Mnesia锁的策略是在读取一条记录的时候,锁住该条记录;在写一条记录的时候锁住记录的所有副本
写锁一般会要求在所有存放表的副本并且是活动的节点上设置,读锁只设置一个节点.Mnesia采用动态策略应对如mnesia:read/1,自动添加和释放锁。程序员无须考虑。
Mnesia不用担心死锁问题,当系统怀疑某个锁死锁时,它会释放该锁,然后再执行一遍, 多个相同事务不能保证顺序执行,但可以保证都执行。程序员不能设定某个事务的优先级。
切不可执行代码带有事务副作用。如在receive语句在事务,可能产生系统假死等。
当一个事务异常终止时,Mnesia会自动的释放其持有的所有锁。
Mnesia函数:
mnesia:transaction(Fun) -> {aborted, Reason} | {atomic, Value},该函数执行一个带函数Fun的事务。
mnesia:read({Tab, Key}) -> transaction abort | RecordList, 返回所有带Key的记录
mnesia:wread({Tab, Key}),该函数和上一函数相同,除由读锁改为写锁,如果执行一个读记录,修改, 写入记录,那么直接用写锁效率更高。
mnesia:write(Record).写入一条记录到数据库
mnesia:delete({Tab, Key}),删除指定表键的所有记录mnesia:delete_object(Record)用Record的OID删除对应记录
粘锁:
普通情况下mnesia每次写入操作的时候,都会锁住所有复件。如果针对一个大量写入到在一个复件的情况下, 那么粘锁就可以派上用场了。在没有其它复件存在的情况下,粘锁和普通锁差不多,没有什么特别影响。
粘锁在第一次使用后, 并不立即释放。下次我们使用粘锁在同一节点的同一记录上,那么这个粘锁就已经设置好了。所有效率更高。多用于一主多从库, 对于有用到两复件间交互则消耗较大。
7、索引
mnesia:add_table_index(Tab, AttributeName)
mnesia:delete_table_index(Tab,AttributeName)