sqlite3
提供了乙個新的鎖和同步機制來提高併發,減少死鎖。
sqlite3
的鎖和同步有
pagermodule(pager.c)
負責處理。
pagermodue
負責sqlite
事務的acid
,也提供快取功能。
pagermodue
不需要知道
btree,
字元編碼
, 索引的結構
, pager module
用來管理
page,
乙個page
對應乙個
diskblock,
大小一般是
1024byte。
1. sqlite3
資料庫的鎖狀態
unlocked
shared
reserved
保留鎖,
表示資料庫將被寫
, 乙個資料庫只能有乙個保留鎖
, 保留鎖可以和共享鎖共存,
與pending
鎖的不同之處在於還能獲得新的共享鎖
,pending
鎖被啟用時
, 不能再獲得共享鎖。
pending
exclusive
2.
回滾日誌檔案
如果有更新資料庫操作
, sqlite
就會生成回滾日誌檔案, 以
"-journal"
的檔名結尾
, 與資料庫檔案存放在同一目錄下。
如果多個資料庫同時工作
, 每個資料庫都有自己的回滾日誌檔案
, 並且還有乙個
master journal
日誌檔案。
master journal
沒有資料
, 只包含各個回滾日誌檔名。每個資料庫的回滾日誌檔案也會包含
masterjournal
檔名。
當訪問資料庫時發現有
"hot journal"
時, sqlite
就會進行回滾工作
, 回滾結束就刪除回滾日誌檔案。 處理
"hot journal"
(1)
嘗試獲得
sharedlock,
如果失敗
, 立即結束
, 返回
sqlite_busy
(2)
檢查是否有
"hotjournal",
如果沒有立即返回
, 否則繼續執行以下步驟
(3)
嘗試獲得
pendinglock,
然後exclusivelock,
如果失敗
, 表示其他程序正在做回滾
, 釋放所有鎖
, 關閉資料庫
, 返回
sqlite_busy
。否則繼續執行
(4)
讀回滾日誌檔案
, 回滾資料庫檔案
(5)
刪除回滾日誌檔案
(6)
刪除masterjournal
檔案(7)
釋放pendinglock
和exclusivelock,
但是保留
sharedlock
3.
寫資料庫檔案步驟
(1)
獲得共享鎖
(2)
獲得reservedlock,
如果失敗
, 返回
sqlite_busy,
否則繼續執行
(3)
生成回滾日誌檔案
, 寫入磁碟
, 等待寫完成繼續執行
如果是單個資料庫檔案
(4)
請求獲得
pendinglock
(5)
請求獲得
exclusivelock
(6) flush/fsync,
將更新寫入磁碟
(7)
刪除回滾日誌檔案
(8)
釋放exclusivelock, pending lock, reserved lock,
獲得shared lock
如果是多個資料庫檔案事務
(4)
請求獲得
pendinglock
和exclusivelock,
確保所有資料庫都獲得
exclusivelock
(5)
生成masterjournal
檔案和每個資料庫的回滾日誌檔案
(6) flush/fsync,
將更新寫入磁碟
(7)
先刪除masterjournal
檔案,
再刪除所有的回滾日誌檔案
(8)
釋放所有資料庫上的
exclusivelock, pending lock
4. sql
事務
預設sqlite autocommit=true
begin transaction - commit
命令使得
sqlite
不在autocommit
下工作。當
sqlite
執行begin
命令時,
不會獲得任何鎖
, 直到執行到第乙個
select,
才獲得乙個
shared lock,
執行到update/insert/delete
才獲得reversed lock,
當快取滿或者
commit
時才請求獲得
exclusive lock。
commit
並非真正的將更新寫到磁碟
, commit
使得sqlite
回到autocommit=true
模式, autocommit
會負責將更新寫到磁碟。
SQLite3 寫資料庫時的鎖機制
於sqlite官方 上的文件 http www.sqlite.org lockingv3.html sqlite3 寫資料庫 為了寫sqlite3 資料庫,程序必須先獲取 shared 鎖。當獲取 shared 鎖之後,程序需要進一步申請 reserved 鎖。reserved 鎖表示該程序會在不遠...
Sqlite3 資料庫使用
iphone本身是支援 sqlite3 資料庫的,在專案中匯入libsqlite3.dylib。並建立資料庫,在終端,建立資料庫的方式 mkdir sql 建立sql資料夾 cd sql 進入sql目錄下 sqlite3 student.sql 建立名為 student.sql的資料庫 建立表 插入...
sqlite3資料庫操作
1 開啟資料庫 1 需要制定資料庫的路徑 nsstring filepath nshomedirectory documents data.sqlite 2 建立資料庫的物件 sqlite3 qingyundb null 3 開啟命令 sqlite3 open dbfilepath utf8stri...