Erlang Mnesia數據庫模塊

mnesia:create_schema/1

在指定的節點列表裏初始化一個新的 Mnesia 數據庫架構

用法:

1

create_schema(DiscNodes) -> ok | {error,Reason}

在指定的節點列表裏的磁盤上初始創建一個新的 Mnesia 數據庫架構。在每個節點的本地 Mnesia 目錄裏會創建各種各樣的文件。注意該每個節點的目錄必須是唯一的。兩個節點可能永遠不會共享相同的目錄。如果可能的話,使用一個本地磁盤設備來提高性能。

如果給出的任何 Erlang 節點 DiscNodes 不存在,或 Mnesia 服務已經在任何節點裏運行,或任何一個節點上已經創建了 Mnesia 的數據庫架構,那麼 mnesia:create_schema/1 將會創建失敗。可以使用 mnesia:delete_schema/1 來清除舊的、有問題的 Mnesia 數據庫架構。

1

mnesia:create_schema([node()]).


mnesia:delete_schema/1

刪除給出的節點裏 Mnesia 數據庫架構

用法:

1

delete_schema(DiscNodes) -> ok | {error,Reason}

刪除一個由 mnesia:create_schema/1 創建的 Mnesia 數據庫架構。如果給出的任何 Erlang 節點 DiscNodes 不存在,或 Mnesia 服務已經在任何節點裏運行,那麼 mnesia:delete_schema/1 將刪除失敗。

1

mnesia:delete_schema([node()]).


mnesia:start/0

啓動一個本地 Mnesia 系統

用法:

1

start() -> ok | {error, Reason}

啓動一個 Mnesia 節點集羣是一個相當複雜的操作過程。一個 Mnesia 系統由一個節點集羣組成,這些節點都是會在本地啓動 Mnesia 服務的節點。正常情況下,每個節點有一個給 Mnesia 寫入文件數據的目錄。該目錄也將被看作是 Mnesia 服務的目錄。Mnesia 也許會啓動在一個無磁盤(disc-less)的節點上。於更多關於 Mnesia 無盤節點的信息可以查看 mnesia:create_schema/1 和 Mesia 用戶指南。

組成 Mnesia 系統的集羣節點是建立在一個架構模式下,並且可以從結構模式裏添加或刪除 Mnesia。架構模式的初始是用 mnesia:create_schema/1 函數在磁盤上創建。在無盤的節點上,一個極小默認的架構模式會在每次 Mnesia 啓動的時候生成。在啓動的過程中,節點間的 Mnesia 服務會互相交換架構模式信息,來驗證表定義方面的兼容性。

每一個架構模式會有一個唯一的 cookie 來認作是一個唯一架構模式的標示符。該 cookie 必須是 Mnesia 啓動的相同所有節點才能運行。關於這方面的更多細節信息可以查看 Mnesia 用戶指南。

架構模式文件(同時也是 Mnesia 所需的其他所有文件)是保存在 Mnesia 服務目錄裏。在命令行裏寫上 "-mnesia dir Dir",可以用來指定 Mnesia 系統保存數據所在的目錄位置。如果命令行不指定,那麼目錄的命令默認爲 "Mnesia.節點名"。

也可以使用 application:start/1 的 application:start(mnesia) 。

1

mnesia:start().


mnesia:create_table/2

創建一個 Mnesia 表

用法:

1

create_table(NameTabDef) -> {atomic, ok} | {aborted, Reason}

根據參數 TabDef 創建一個名爲 Name 的 Mnesia 表。

1

mnesia:create_table(mnesia_table_name, [{ram_copies, [node()]}, {disc_only_copies, nodes()}, {storage_properties, [{ets, [compressed]}, {dets, [{auto_save, 5000}]} ]}]).


mnesia:wait_for_tables/2

等待一個 Mnesia 表直到表可以被訪問

用法:

1

wait_for_tables(TabList,Timeout) -> ok | {timeout, BadTabList} | {error, Reason}

一些應用的某些表可能由於表數據很大,以至初始的適合需要一個初始等待的時間才能正常訪問到該表的數據。mnesia:wait_for_tables/2 懸停等待一段時間,直到在 TabList 的所有表可以被訪問,或超過等待的時間。

下面是等待 5 秒來確認 mnesia_table_name 已經加載:

1

mnesia:wait_for_tables([mnesia_table_name], 5000).

運行代碼

下面是無限等待:

1

mnesia:wait_for_tables([mnesia_table_name], infinity).


mnesia:stop/0

關停 Mnesia 系統

用法:

1

stop() -> stopped

關停在當前節點的本地 Mnesia 服務。也可以使用 application:stop/1 的 application:stop(mnesia) 。

1

mnesia:stop().


mnesia:clear_table/1

永久刪除表格Tab的內容。

1

mnesia:clear_table(Tab). 


mnesia:write/1

調用函數write(Tab, Record, write),如果新建的記錄和數據表裏的某一行具有相同的主鍵,就會覆蓋那一行,否則就會創建一個新行。

用法:

1

mnesia:write(Record)


mnesia:write/3

將記錄Record寫入表Tab。

該函數返回ok,或者在發生錯誤時終止。例如,如果不存在該表,則事務終止。


mnesia:transaction/1

寫過程

transaction:普通事務,數據更新滿足事務的 ACID 特性,也會同步擴散到所有包含數據副本的mnesia結點,但事務提交時不要求各個副本結點的日誌存儲在磁盤上;

在事務內部執行的代碼可以由一系列表操作功能組成。如果由於用戶錯誤或某個表不可用而導致事務內部出現問題,則整個事務將終止,函數 transaction / 1返回元組 {aborted,Reason}。如果一切順利,則返回{atomic,ResultOfFun},其中ResultOfFunFun中最後一個表達式的值。

用法:

1

mnesia:transaction(F)


mnesia:delete/1

移除某一行,要移除某一行,需要知道該行的對象Id(Object,簡稱OID)。它由表名和主鍵的值構成

用法:

1

mnesia:delete(Oid)


mnesia:read/2

返回記錄

1

mnesia:read({Tab, Key})

調用函數mnesia : read ( Tab, Key, read)


mnesia:read/3

返回記錄

使用鍵Key從表Tab讀取所有記錄。無論Tab的位置如何,此函數具有相同的語義。如果表的類型爲bag,則函數 mnesia:read(Tab,Key)可以返回任意長的列表。如果表是set類型的 ,則列表的長度爲1或[]。

該函數的語義是上下文相關的。有關詳細信息,請參見mnesia:activity / 4。在事務上下文中,它獲取類型爲LockKind的鎖 。當前,支持鎖類型read, write和sticky_write。

如果用戶想要更新記錄,它可以更有效地使用寫/ sticky_write作爲 LockKind。如果多數檢查在該表上處於活動狀態,則在嘗試寫鎖定時將對其進行檢查。如果不滿足多數條件,則可用於快速結束。

1

mnesia:delete(Oid)


mnesia:abort/1

事務返回

事務默認返回元組{aborted,Reason}。Mnesia事務的終止意味着對封閉的catch拋出異常。因此,表達式catch mnesia:abort(x)不會終止事務。

當這個事務失敗時(即調用mnesia:abort(Reason)時),mnesia:write所做的更改都會被撤銷,數據庫恢復到了進入事務之前的狀態。

1

mnesia:abort(Reason) 


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章