資料庫系統原理學習筆記

2021-10-06 23:53:10 字數 2952 閱讀 4520

二、併發一致性問題

三、四種隔離級別

四、多版本併發控制

事務是指滿足acid特性的一組操作。

1.原子性(atomicity)

事務被視為不可分割的最小單元,事務包含的所有操作要麼全部提交成功,要麼全部失敗回滾。

回滾可以用回滾日誌(undo log)來實現,回滾日誌記錄著事務所執行的修改操作,在回滾時反向執行這些修改操作即可。

2.一致性(consistency)

資料庫在事務執行前後保持一致性狀態,在一致性狀態下,所有事務對同乙個資料的讀取結果都是相同的。

3.隔離性(isolation)

事務所做的修改在最終提交之前,對其它事務是不可見的。

4.永續性(durability)

事務一旦被提交,其所做的修改將會永遠儲存到資料庫中。即使系統發生崩潰,事務執行的結果也不能丟失。

系統發生崩潰可以用重做日誌(redo log)進行恢復,從而實現永續性。與回滾日誌記錄資料的邏輯修改不同,重做日誌記錄的是資料頁的物理修改!

在併發環境下,事務的隔離性很難保證,因此會出現很多併發一致性問題

乙個事務的更新操作被另外乙個事務的更新操作替換,如下圖所示:

指當前事務可以讀到其他事務未提交的資料,如下圖:

指在乙個事務內多次讀取同一資料集合,在這一事務還未結束前,另一事務也訪問了該同一資料集合並做了修改,導致同一事務中兩次讀取的資料可能不一致,如下圖:

幻影讀本質上也屬於不可重複讀的情況,其強調的是事務多次讀取某個範圍的資料,而另一事務在該範圍內插入/刪除了的資料,使得同一事務兩次讀取結果不同,如下圖:

注:不可重複讀和幻影讀的區別在於,不可重複讀強調的是資料被修改了,而幻影讀強調的是範圍內資料新增或減少了。

產生併發不一致性問題的主要原因是破壞了事務的隔離性,解決方法是通過併發控制來保證隔離性。併發控制可以通過封鎖來實現,但是封鎖操作需要使用者自己控制,相當複雜。資料庫管理系統提供了事務的隔離級別,讓使用者以一種更輕鬆的方式處理併發一致性問題。

指事務中的修改,即使沒有提交,對其他事務也是可見的。

事務在最終提交之前,對其他事務是不可見的,也就是說乙個事務只能讀取到已經提交的事務所做的修改。

同一事務中多次讀取同一資料的結果是一樣的。

所有事務序列執行,事務間互不干擾,因此不會出現併發一致性問題。

多版本併發控制(mvcc)是mysql的innodb儲存引擎實現隔離級別的一種具體方式,用於實現提交讀和可重複讀兩種隔離級別。未提交讀隔離級別總是讀取最新的資料行,要求很低,無需使用mvcc。可序列化隔離級別需要對所有讀取的行都加鎖,單純使用mvcc無法實現。

加鎖能解決多個事務同時執行時出現的併發一致性問題,又由於實際場景中讀操作往往多於寫操作,因此我們引入了讀寫鎖來避免不必要的加鎖操作(讀/讀沒有互斥關係)。但加鎖方式中,讀和寫操作仍然是互斥的,mvcc利用多版本的思想,使得讀和寫操作沒有了互斥關係:寫操作更新最新的版本快照,而讀操作去讀舊版本的快照。

在mvcc中事務的修改操作(如delete、insert、update)會為資料行新增乙個版本快照。

mvcc 的多版本指的是多個版本的快照,快照儲存在 undo 日誌中,該日誌通過回滾指標 roll_ptr 把乙個資料行所有快照連線起來。

例如在 mysql 建立乙個表 t,包含主鍵 id 和乙個字段 x。我們先插入乙個資料行,然後對該資料行執行兩次更新操作。

insert

into t(id, x)

values(1

,"a");

update t set x=

"b"where id=1;

update t set x=

"c"where id=

1;

因為沒有使用 start transaction 將上面的操作當成乙個事務來執行,根據 mysql 的 autocommit 機制,每個操作都會被當成乙個事務來執行,所以上面的操作總共涉及到三個事務。快照中除了記錄事務版本號 trx_id 和操作之外,還記錄了乙個 bit 的 del 字段,用於標記是否被刪除。

insert、update、delete 操作會建立乙個日誌,並將事務版本號 trx_id 寫入。delete 可以看成是乙個特殊的 update,還會額外將 del 字段設定為 1。

mvcc 維護了乙個 readview 結構,主要包含了當前系統未提交的事務列表 trx_ids ,還有該列表的最小值 trx_id_min 和 trx_id_max。

在進行 select 操作時,根據資料行快照的 trx_id 與 trx_id_min 和 trx_id_max 之間的關係,從而判斷資料行快照是否可以使用:

在資料行快照不可使用的情況下,需要沿著undo log的回滾指標roll_ptr找到下乙個快照,再進行上面的判斷。

資料庫系統原理學習筆記十三 儲存函式

儲存函式與儲存過程一樣,是由sql語句和過程式語句組成的 片段。相同點 儲存函式與儲存過程一樣,是由sql語句和過程式語句組成的 片段。不同點 使用create function語句建立儲存函式 create function sp name func parameter returns type ...

資料庫原理學習筆記

事務被視為不可分割的最小單元,事務的所有操作要麼全部提交成功,要麼全部失敗回滾。回滾可以用回滾日誌 undo log 來實現,回滾日誌記錄著事務所執行的修改操作,在回滾時反向執行這些修改操作即可。資料庫在事務執行前後都保持一致性狀態。在一致性狀態下,所有事務對同乙個資料的讀取結果都是相同的。乙個事務...

筆記 MySQL資料庫系統原理

正規化er圖 事務指的是滿足 acid 特性的一組操作。可以通過 commit 提交乙個事務,也可以使用 rollback 進行回滾。髒讀 未提交讀。不可重複讀 未提交讀 提交讀。幻讀 未提交讀 提交讀 可重複讀。封鎖粒度 行鎖 表鎖。封鎖型別 讀寫鎖 意向鎖。讀鎖 s 寫鎖 x 給單位加讀鎖,不影...