SQLite鎖機(jī)制

一蟀拷、SQLite3 事務(wù)與鎖狀態(tài)描述

SQLite3總共有三種事務(wù)類(lèi)型BEGIN [ DEFERRED /IMMEDIATE / EXCLUSIVE ] TRANSCATION胶坠,提供以下五種的文件鎖狀態(tài)缆镣,按鎖的級(jí)別依次是:UNLOCKED / SHARED / RESERVERD / PENDING / EXCLUSIVE

1). UNLOCKED:無(wú)鎖
  文件沒(méi)有持有任何鎖,即當(dāng)前數(shù)據(jù)庫(kù)不存在任何讀或?qū)懙牟僮鳌F渌倪M(jìn)程可以在該數(shù)據(jù)庫(kù)上執(zhí)行任意的讀寫(xiě)操作坦康。此狀態(tài)為缺省狀態(tài)。
2). SHARED:共享鎖
  在此狀態(tài)下诡延,該數(shù)據(jù)庫(kù)可以被讀取但是不能被寫(xiě)入滞欠。在同一時(shí)刻可以有任意數(shù)量的進(jìn)程在同一個(gè)數(shù)據(jù)庫(kù)上持有共享鎖,因此讀操作是并發(fā)的肆良。換句話說(shuō)筛璧,只要有一個(gè)或多個(gè)共享鎖處于活動(dòng)狀態(tài)逸绎,就不再允許有數(shù)據(jù)庫(kù)文件寫(xiě)入的操作存在。
3). RESERVED:保留鎖
  假如某個(gè)進(jìn)程在將來(lái)的某一時(shí)刻打算在當(dāng)前的數(shù)據(jù)庫(kù)中執(zhí)行寫(xiě)操作夭谤,然而此時(shí)只是從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)棺牧,那么我們就可以簡(jiǎn)單的理解為數(shù)據(jù)庫(kù)文件此時(shí)已經(jīng)擁有了保留鎖。當(dāng)保留鎖處于活動(dòng)狀態(tài)時(shí)沮翔,該數(shù)據(jù)庫(kù)只能有一個(gè)或多個(gè)共享鎖存在陨帆,即同一數(shù)據(jù)庫(kù)的同一時(shí)刻只能存在一個(gè)保留鎖和多個(gè)共享鎖曲秉。
  在Oracle中此類(lèi)鎖被稱(chēng)之為預(yù)寫(xiě)鎖采蚀,不同的是Oracle中鎖的粒度可以細(xì)化到表甚至到行,因此該種鎖在Oracle中對(duì)并發(fā)的影響程序不像SQLite中這樣大承二。
4). PENDING:等待鎖(寫(xiě)等待)
  PENDING鎖的意思是說(shuō)榆鼠,某個(gè)進(jìn)程正打算在該數(shù)據(jù)庫(kù)上執(zhí)行寫(xiě)操作,然而此時(shí)該數(shù)據(jù)庫(kù)中卻存在很多共享鎖(讀操作)亥鸠,那么該寫(xiě)操作就必須處于等待狀態(tài)妆够,即等待所有共享鎖消失為止,與此同時(shí)负蚊,新的讀操作將不再被允許神妹,以防止寫(xiě)鎖饑餓的現(xiàn)象發(fā)生。在此等待期間家妆,該數(shù)據(jù)庫(kù)文件的鎖狀態(tài)為PENDING鸵荠,在等到所有共享鎖消失以后,PENDING鎖狀態(tài)的數(shù)據(jù)庫(kù)文件將在獲取排他鎖之后進(jìn)入EXCLUSIVE狀態(tài)伤极。
5). EXCLUSIVE:排它鎖(寫(xiě))
  在執(zhí)行寫(xiě)操作之前蛹找,該進(jìn)程必須先獲取該數(shù)據(jù)庫(kù)的排他鎖。然而一旦擁有了排他鎖哨坪,任何其它鎖類(lèi)型都不能與之共存庸疾。因此,為了最大化并發(fā)效率当编,SQLite將會(huì)最小化排他鎖被持有的時(shí)間總量届慈。

二、SQLite3 并發(fā)控制過(guò)程

SQLite的并發(fā)控制機(jī)制是采用加鎖的方式忿偷,實(shí)現(xiàn)非常簡(jiǎn)單金顿,但也非常的巧妙。請(qǐng)仔細(xì)閱讀下圖牵舱,它可以幫助更好的理解下面的內(nèi)容串绩。

當(dāng)執(zhí)行select即讀操作時(shí),需要獲取到SHARED鎖(共享鎖)芜壁,當(dāng)執(zhí)行insert/update/delete操作(即內(nèi)存寫(xiě)操作時(shí))礁凡,需要進(jìn)一步獲取到RESERVERD鎖(保留鎖)高氮,當(dāng)進(jìn)行commit操作(即磁盤(pán)寫(xiě)操作時(shí)),需要進(jìn)一步獲取到EXCLUSIVE鎖(排它鎖)顷牌。
  對(duì)于RESERVERD鎖剪芍,sqlite3保證同一時(shí)間只有一個(gè)連接可以獲取到保留鎖,也就是同一時(shí)間只有一個(gè)連接可以寫(xiě)數(shù)據(jù)庫(kù)(內(nèi)存)窟蓝,但是其它連接仍然可以獲取SHARED鎖罪裹,也就是其它連接仍然可以進(jìn)行讀操作(這里可以認(rèn)為寫(xiě)操作只是對(duì)磁盤(pán)數(shù)據(jù)的一份內(nèi)存拷貝進(jìn)行修改,并不影響讀操作)运挫。
  對(duì)于EXCLUSIVE鎖状共,是比保留鎖更為嚴(yán)格的一種鎖,在需要把修改寫(xiě)入磁盤(pán)即commit時(shí)需要在保留鎖/未決鎖的基礎(chǔ)上進(jìn)一步獲取到排他鎖谁帕,顧名思義峡继,排他鎖排斥任何其它類(lèi)型的鎖,即使是SHARED鎖也不行匈挖,所以碾牌,在一個(gè)連接進(jìn)行commit時(shí),其它連接是不能做任何操作的(包括讀)儡循。
  PENDING鎖(即未決鎖)舶吗,則是比較特殊的一種鎖,它可以允許已獲取到SHARED鎖的事務(wù)繼續(xù)進(jìn)行择膝,但不允許其它連接再獲取SHARED鎖誓琼,當(dāng)已存在的SHARED鎖都被釋放后(事務(wù)執(zhí)行完成),持有未決鎖的事務(wù)就可以獲得commit的機(jī)會(huì)了调榄。sqlite3使用這種鎖來(lái)防止writer starvation(寫(xiě)?zhàn)I死)踊赠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市每庆,隨后出現(xiàn)的幾起案子筐带,更是在濱河造成了極大的恐慌,老刑警劉巖缤灵,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伦籍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡腮出,警方通過(guò)查閱死者的電腦和手機(jī)帖鸦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胚嘲,“玉大人作儿,你說(shuō)我怎么就攤上這事〔雠” “怎么了攻锰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵晾嘶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我娶吞,道長(zhǎng)垒迂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任妒蛇,我火速辦了婚禮机断,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘绣夺。我一直安慰自己吏奸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布乐导。 她就那樣靜靜地躺著苦丁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上修陡,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天聚假,我揣著相機(jī)與錄音,去河邊找鬼杂瘸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的仪媒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼谢鹊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼算吩!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起佃扼,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤偎巢,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后兼耀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體压昼,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年瘤运,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窍霞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拯坟,死狀恐怖但金,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郁季,我是刑警寧澤冷溃,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布掠哥,位于F島的核電站,受9級(jí)特大地震影響秃诵,放射性物質(zhì)發(fā)生泄漏续搀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一菠净、第九天 我趴在偏房一處隱蔽的房頂上張望禁舷。 院中可真熱鬧,春花似錦毅往、人聲如沸牵咙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)洁桌。三九已至,卻和暖如春侯嘀,著一層夾襖步出監(jiān)牢的瞬間另凌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工戒幔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吠谢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓诗茎,卻偏偏與公主長(zhǎng)得像工坊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敢订,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容