事務的類型:
事務三種不同的類型,以不同的鎖狀態啟動事務。
在begin命令中指定事務類型:begin [ deferred | immediate | exclusive ] transaction ;
deferred必須到使用是才能擷取鎖。預設從未鎖定狀態開始。以deferred開始的事務,是延遲的,停留在未鎖定狀態。多個串連可以在同時刻未建立任何鎖的情況下開始延遲事務。這種情況下,第一個對資料庫的讀操作擷取共用鎖定,第一個對資料庫的寫操作擷取預留鎖。
immediate事務在begin的時候就視圖擷取預留鎖。若成功,begin immediate保證無其他串連寫資料庫,但是其他串連可以讀取資料庫。預留鎖的另一個結果是沒有其他串連能成功啟動begin immediate或者 begin exclusive命令,當其他串連執行上述命令時,SQLite會返回SQLite_busy錯誤。這時候可以修改資料庫,但不能提交,使用commit時會有SQLite_busy錯誤。也就是說,還沒有讀事務完成,得繼續等待。
exclusive事務會試著擷取獨佔鎖定,類似於immediate事務,值得注意的是,在擷取獨佔鎖定後,資料庫沒其他的活動連結,本串連可以任意讀寫資料庫。
資料庫管理:
附加資料庫:
SQLite允許利用attach命令將多個資料庫定位”附加“到當前串連上,在全域範圍內他的內容都是可取的。
文法形式: attach [database] filename as database_name;
filename是SQLite資料庫的檔案名稱和路徑,database_name 是要引用的資料庫和對象的邏輯名稱。主要資料庫自動賦名為main。如果建立臨時對象,SQLite會自動建立一個附加的資料庫,並且命名為temp。邏輯名稱可以用來引用附加資料庫內的對象,於此同時,引用附加資料庫的對象必須提供邏輯名。這個在兩個資料庫中有相同的表的時候,很管用。
使用全名引用資料庫中的對象:
分離資料庫:
detach [database] database_name;
資料庫清理:
命令:reindex(用於重建索引,重建所有使用指定排序名稱的索引) 和 vacuum (重構資料庫清理未使用的空間 ,開放狀態的事務,vacuum是不執行的)。
reindex的用法:reindex collation_name;
reindex table_name | index_name ;
vacuum的用法: VACUUM
[index-or-table-name]
資料庫配置:
SQLite沒有設定檔,其所有的配置參數都是利用pragma實現的。這個pragma有著命令和變數的特點。
編譯指示中的常用的內容:
a,串連緩衝區大小:
控制一個串連可以在記憶體中使用多少個資料庫頁。方式:pragma cache_size;
注意:可以使用default_cache_size編譯指示來預設所有的串連設定永久緩衝區的大小。
這種設定可以儲存於資料庫中,只是對以後的串連生效,對當前的串連不起作用。緩衝其實可以在事務為預留鎖的時候,儲存待定的變
化。緩衝區大對於擷取獨佔鎖定之前能做的事情量是有鼓勵的。
b, 擷取資料庫資訊:
database_list : 擷取所有附著的資料庫,
為看的清楚起見,我把臨時建立的資料庫temp.db附加到test.db上了。
index_info : 列舉出索引內欄位的相關資訊。索引名作為參數,
index_list : 列出表中的索引資訊。表名作為參數。
table_info : 列出表中所有欄位的相關資訊。
c,寫同步:
通常,SQLite會在關鍵時刻將所有的變化提交到磁碟保證事務的持久性。但是,因為影響效能,可以考慮關閉這個功能。
編譯指示synchronous來實現。該編譯指示的三種設定:full , normal ,off。
full:在繼續前,在關鍵點暫停以確保所有的資料實際寫入磁碟。確保了即使系統崩潰或者電力中斷,重啟後資料庫依然是未損的。很安全,但慢。
normal:在大多關鍵點暫停,但是不太頻繁了。某個電力中斷可能導致資料庫受損。實際中,可能會遭受嚴重的磁碟操作失敗或者其他不課恢複的硬體故障。
off:將資料拋給OS後立即繼續工作。加速50倍左右,但是問題是,如果運行SQLite的應用程式崩潰,資料依然是安全的。如果系統崩潰或者停電,可能會導致資料損毀。
d,臨時儲存空間:
儲存臨時資料(臨時的表、索引、其他對象)的地方。
兩個編譯指示控制臨時儲存空間:
temp_store :決定是使用記憶體還是磁碟作為臨時儲存空間;三個選項:default(使用內編譯的預設項),file(使用OS檔案),memory
(使用記憶體);
temp_store_directory:儲存臨時檔案的目錄,但是在file作為儲存介質的情況下。
e,頁大小、編碼和自動清理:
必須在建立資料庫前設定。
資料庫大小可以通過auto_vacuum自動保持在最小。啟動auto_vacuum時,刪除的事務提交時,資料庫會變小。vacuum對使用auto_vacuum的資料庫不起作用。
f,調試:
四個調試的編譯指示:integrity_check 可查看次序顛倒的記錄、缺失、畸形記錄、損毀的索引等。如果損毀,返回描述問題的字串,如正常,返回ok。其他編譯指示追蹤解析器和虛擬資料庫引擎,只要資料庫編譯時間啟用了調試資訊,就可以啟用這些編譯指示。
系統目錄:
系統資料表:sqlite_master,包含所有表、視圖、索引和觸發器的資訊。
rootpage指的是對象的第一個B-tree頁面在資料庫檔案中的位置。
查看查詢計劃:
利用explain query plan查看SQLite執行查詢的方法。在此命令後加上查詢文本。
----------------------------《over》-------------------------------
小記:曆時20天,共計21篇。還會在後面繼續寫,直到深入核心,讀懂源碼。最後,學習PHP,利用PHP+SQLite+……構架網站,這是後話。源碼是目前的重點。