SQLite3資料庫中的檔案鎖和同步機制

2021-06-20 06:38:19 字數 3103 閱讀 7529

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...