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用戶手冊的閱讀總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM