sqlite的事務和鎖

2021-06-25 08:00:18 字數 2394 閱讀 1391

一、事務 :

事務定義了一組sql命令的邊界,這組命令或者作為乙個整體被全部執行,或者都不執行。事務的典型例項是轉帳。 

二、事務的範圍 :

事務由3個命令控制:begin、commit和rollback。begin開始乙個事務,之後的所有操作都可以取消。commit使begin後的所有命令得到確認;而rollback還原begin之後的所有操作。如: 

sqlite> begin; 

sqlite> delete from foods; 

sqlite> rollback; 

sqlite> select count(*) from foods; 

count(*) 

412 

上面開始了乙個事務,先刪除了foods表的所有行,但是又用rollback進行了回卷。再執行select時發現表中沒發生任何改變。 

sqlite預設情況下,每條sql語句自成事務(自動提交模式)。

三、衝突解決 :

如前所述,違反約束會導致事務的非法結束。大多數資料庫(管理系統)都是簡單地將前面所做的修改全部取消。 

sqlite有其獨特的方法來處理約束違反(或說從約束違反中恢復),被稱為衝突解決。 

如: sqlite> update foods set id=800-id; 

sql error: primary key must be unique 

sqlite提供5種衝突解決方案:replace、ignore、fail、abort和rollback。 

replace: 當發違反了唯一完整性,sqlite將造成這種違反的記錄刪除,替代以新插入或修改的新記錄,sql繼續執行,不報錯。 

ignore 

fail 

abort 

rollback 

資料庫鎖 :

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

sqlite採用粗放型的鎖:

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

sqlite使用鎖逐步上公升機制,為了寫資料庫,連線需要逐級地獲得排它鎖。

sqlite有5個不同的鎖狀態:

未加鎖(unlocked)

、共享 (shared)

、保留(reserved)

、未決(pending)

和排它(exclusive)

。每個資料庫連線在同一時刻只能處於其中乙個狀態。每 種狀態(未加鎖狀態除外)都有一種鎖與之對應。 

最初的狀態是未加鎖狀態,在此狀態下,連線還沒有訪問資料庫。當連線到了乙個資料庫,甚至已經用

begin開始

了乙個事務時,連線都還

處於未加鎖

狀態。 

未加鎖狀態的下乙個狀態是共享狀態。為了能夠從資料庫中

讀(不寫)資料

,連線必須首先進入

共享狀態

,也就是說首先要獲得乙個共享鎖。多個連線可以 同時獲得並保持共享鎖,也就是說

多個連線可以同時從同乙個資料庫中讀資料。但哪怕只有乙個共享鎖還沒有釋放,也不允許任何連線寫資料庫

。 如果乙個連線想要

寫資料庫

,它必須首先獲得乙個

保留鎖。

乙個資料庫上同時只能有乙個保留鎖。保留鎖可以與共享鎖共存

,保留鎖是寫資料庫的第1階段。保留鎖即不阻止其它擁有共享鎖的連線繼續讀資料庫,也不阻止其它連線獲得新的共享鎖。 

一旦乙個連線

獲得了保留鎖

,它就可以開始

處理資料庫修改操作

了,儘管這些

修改只能在緩衝區中進行,而不是實際地寫到磁碟

。對讀出內容所做的修改儲存在記憶體緩衝區中。 

當連線想要

提交修改(或事務)時,需要將保留鎖提公升為排它鎖

。為了得到排它鎖,還必須首先將

保留鎖提公升為未決鎖

。獲得未決鎖之後,其它連線就不能 再獲得新的共享鎖了,但已經擁有共享鎖的連線仍然可以繼續正常讀資料庫。此時,

擁有未決鎖的連線等待其它擁有共享鎖的連線完成工作並釋放其共享鎖。 

一旦所有其它共享鎖都被釋放,擁有

未決鎖的連線就可以將其鎖提公升至排它鎖,此時就可以自由地對資料庫進行修改

了。所有以前對緩衝區所做的修改都會被寫到資料庫檔案。

事務的種類

sqlite有三種不同的事務,使用不同的鎖狀態。事務可以開始於:deferred、mmediate或exclusive。事務型別在begin命令中指定: 

基本的準則

:如果你正在使用的資料庫沒有其它的連線,用begin就足夠了。但是,如果你使用的資料庫有其它的連線也會對資料庫進行寫操作,就得使用begin immediate或begin exclusive開始你的事務。

事務和鎖 SQLite

2 事務 transaction 2.1 事務的週期 transaction lifecycles 程 序與事務之間有兩件事值得注意 1 哪些物件在事務下執行 這直接與api有關。2 事務的生命週期,即什麼時候開始,什麼時候結束以及它在什麼時候開始影響別的連線 這點對於併發性很重要 這涉及到sqli...

事務和鎖 SQLite

2 事務 transaction 2.1 事務的週期 transaction lifecycles 程 序與事務之間有兩件事值得注意 1 哪些物件在事務下執行 這直接與api有關。2 事務的生命週期,即什麼時候開始,什麼時候結束以及它在什麼時候開始影響別的連線 這點對於併發性很重要 這涉及到sqli...

事務和鎖 SQLite

2 事務 transaction 2.1 事務的週期 transaction lifecycles 程 序與事務之間有兩件事值得注意 1 哪些物件在事務下執行 這直接與api有關。2 事務的生命週期,即什麼時候開始,什麼時候結束以及它在什麼時候開始影響別的連線 這點對於併發性很重要 這涉及到sqli...