sqlite的鎖是基於標準檔案鎖實現的。sqlite在資料庫檔案上持有三種不同的檔案鎖:a reserved byte, a pending byte, and a shared region(圖2.5)。
圖2.5 鎖的機制
它們都是從pending byte開始。如圖2.4所示,為了從unlocked移動到shared,乙個連線在pendingbyte會首先嘗試獲取讀鎖。如果成功了,它就會在shared region的隨機位元組獲得讀鎖並會在pending byte釋放它。為了從shared移動到reserved,乙個連線會嘗試在reserved byte獲取寫鎖。為了從reserved到exclusive,乙個連線會試圖在pending byte獲取寫鎖。如果成功,就會引起損耗程序,因為它不允許其他連線在pending byte獲取讀鎖進入shared。最後,為了獲得exclusive鎖,這個連線會試圖在整個shared region獲得寫鎖。這一步就保證了只有其他所有的shared鎖被釋放之後才能獲得exclusive鎖,因為shared region持有其他所有活躍連線的讀鎖。
sqlite的崩潰恢復機制就是利用reservedbyte來確定乙個資料庫是否需要恢復。因為日誌檔案和reserved鎖是同步進行,如果pager只看到前乙個而沒看到後邊的那個,那就出問題了。每當pager想要開啟資料庫或者從資料庫取頁時,它都會做乙個簡單的一致性檢測。如果它只看到日誌檔案而沒看到reserved鎖,那就是建立日誌檔案的程序崩潰了或者系統出了問題。這樣,這種日誌被稱為熱日誌,而資料庫就可能處在不一致狀態。為了恢復正常,日誌需要「回做」來使資料庫恢復到中斷事務之前的狀態。
為啟動回做操作,pager會將資料庫放在恢復模式下。它會像圖2.4那樣直接從shared跳到pending。只有這種情況下才有這種轉換。它跳過reserved鎖有兩方面的原因:
(1) 保證沒有新連線進入資料庫
(2) 保證其他在shared的活躍連線都不能進入恢復模式。除了恢復連線外其他的都臨時掛起。
實際上,乙個熱日誌就是乙個隱式的exclusive鎖。如果乙個writer崩潰了,在有連線恢復它之前,資料庫中的其他活動都無法進行。
事務學習筆記(2)
springboot使用註解進行事務的是宣告式事務 有時候我們需要判斷事務是否執行成功 這時候宣告式事務就不夠了 就需要程式設計式事務 author chenlinhang description todo date 下午 10 19 2019 4 13 0013 param return bool...
redis 學習13 事務
redis單條命令是保證原子性的,而redis事務不保證原子性 redis事務的本質 一組命令的集合!乙個事務中的所有命令是會被序列化,在事務執行過程中,命令會按照順序執行!一次性!順序性!排他性!並沒有隔離級別的概念!redis事務 1,開啟事務 multi 2,命令入隊 其他命令 3,執行事務 ...
Mysql事務 學習筆記2
lbcc也就是基於鎖 先介紹lbcc也就是鎖,官方從很多方面來給鎖分類,最大類可分表鎖,行鎖 表鎖與行鎖的區別 鎖定粒度 表鎖 行鎖 加鎖效率 表鎖 行鎖 衝突概率 表鎖 行鎖 併發效能 表鎖 行鎖 在innodb中實現了兩個標準的行級鎖,可以看成讀寫鎖 s共享鎖 讀鎖 其他事務可以讀,也可以繼續加...