Sqlite資料庫的鎖

2021-06-02 16:11:07 字數 976 閱讀 8215

在sqlite中,鎖和事務是緊密聯絡的。為了有效地使用事務,需要了解一些關於如何加鎖的知識。

sqlite採用粗放型的鎖。當乙個連線要寫資料庫,所有其它的連線被鎖住,直到寫連線結束了它的事務。sqlite有乙個加鎖表,來幫助不同的寫資料庫都能夠在最後一刻再加鎖,以保證最大的併發性。

sqlite使用鎖逐步上公升機制,為了寫資料庫,連線需要逐級地獲得排它鎖。sqlite有5個不同的鎖狀態:未加鎖(unlocked)、共享(shared)、保留(reserved)、未決(pending)和排它(exclusive)。每個資料庫連線在同一時刻只能處於其中乙個狀態。每種狀態(未加鎖狀態除外)都有一種鎖與之對應。

最初的狀態是未加鎖狀態,在此狀態下,連線還沒有訪問資料庫。當連線到了乙個資料庫,甚至已經用begin開始了乙個事務時,連線都還處於未加鎖狀態。

未加鎖狀態的下乙個狀態是共享狀態。為了能夠從資料庫中讀(不寫)資料,連線必須首先進入共享狀態,也就是說首先要獲得乙個共享鎖。多個連線可以同時獲得並保持共享鎖,也就是說多個連線可以同時從同乙個資料庫中讀資料。但哪怕只有乙個共享鎖還沒有釋放,也不允許任何連線寫資料庫。

如果乙個連線想要寫資料庫,它必須首先獲得乙個保留鎖。乙個資料庫上同時只能有乙個保留鎖。保留鎖可以與共享鎖共存,保留鎖是寫資料庫的第1階段。保留鎖即不阻止其它擁有共享鎖的連線繼續讀資料庫,也不阻止其它連線獲得新的共享鎖。

一旦乙個連線獲得了保留鎖,它就可以開始處理資料庫修改操作了,儘管這些修改只能在緩衝區中進行,而不是實際地寫到磁碟。對讀出內容所做的修改儲存在記憶體緩衝區中。

當連線想要提交修改(或事務)時,需要將保留鎖提公升為排它鎖。為了得到排它鎖,還必須首先將保留鎖提公升為未決鎖。獲得未決鎖之後,其它連線就不能再獲得新的共享鎖了,但已經擁有共享鎖的連線仍然可以繼續正常讀資料庫。此時,擁有未決鎖的連線等待其它擁有共享鎖的連線完成工作並釋放其共享鎖。

一旦所有其它共享鎖都被釋放,擁有未決鎖的連線就可以將其鎖提公升至排它鎖,此時就可以自由地對資料庫進行修改了。所有以前對緩衝區所做的修改都會被寫到資料庫檔案。

SQLite資料庫的鎖機制

sqlite資料庫的鎖機制包括四種鎖,共享鎖 shared lock 預留鎖 reserved lock 和未決鎖 pending lock 排他鎖 exclusive lock 其中讀操作,用的是shared lock,所以併發的多個讀資料庫。如果有乙個讀操作存在,那麼都不會允許寫。而寫就比較麻煩...

SQLite3 寫資料庫時的鎖機制

於sqlite官方 上的文件 http www.sqlite.org lockingv3.html sqlite3 寫資料庫 為了寫sqlite3 資料庫,程序必須先獲取 shared 鎖。當獲取 shared 鎖之後,程序需要進一步申請 reserved 鎖。reserved 鎖表示該程序會在不遠...

資料庫的管理SQLite

sqliteopenhelper 通過繼承這個類,開發者可以很容易的設計和運算元據庫,注意封裝會使android的效能降低,在繼承sqliteopenhelper時候必須實現oncreate onupgrade 函式 public class dbhelper extends sqliteopenh...