參考資料:
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用戶手冊的閱讀總結