資料庫原理學習筆記

2021-10-10 22:57:11 字數 2450 閱讀 5546

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

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

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

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

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

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

丟失修改指乙個事務的更新操作被另外乙個事務的更新操作替換。一般在現實生活中常會遇到,例如:t1 和 t2 兩個事務都對乙個資料進行修改,t1 先修改並提交生效,t2 隨後修改,t2 的修改覆蓋了 t1 的修改。

讀髒資料指在不同的事務下,當前事務可以讀到另外事務未提交的資料。例如:t1 修改乙個資料但未提交,t2 隨後讀取這個資料。如果 t1 撤銷了這次修改,那麼 t2 讀取的資料是髒資料。

不可重複讀指在乙個事務內多次讀取同一資料集合。在這一事務還未結束前,另一事務也訪問了該同一資料集合並做了修改,由於第二個事務的修改,第一次事務的兩次讀取的資料可能不一致。例如:t2 讀取乙個資料,t1 對該資料做了修改。如果 t2 再次讀取這個資料,此時讀取的結果和第一次讀取的結果不同。

幻讀本質上也屬於不可重複讀的情況,t1 讀取某個範圍的資料,t2 在這個範圍內插入新的資料,t1 再次讀取這個範圍的資料,此時讀取的結果和和第一次讀取的結果不同。

不可重複讀體現在資料的修改上,幻讀體現在資料的插入和刪除上

mysql 中提供了兩種封鎖粒度:行級鎖以及表級鎖。

應該盡量只鎖定需要修改的那部分資料,而不是所有的資源。鎖定的資料量越少,發生鎖爭用的可能就越小,系統的併發程度就越高。

但是加鎖需要消耗資源,鎖的各種操作(包括獲取鎖、釋放鎖、以及檢查鎖狀態)都會增加系統開銷。因此封鎖粒度越小,系統開銷就越大。

在選擇封鎖粒度時,需要在鎖開銷和併發程度之間做乙個權衡。

互斥鎖(exclusive),簡寫為 x 鎖,又稱寫鎖。

共享鎖(shared),簡寫為 s 鎖,又稱讀鎖。

有以下兩個規定:

乙個事務對資料物件 a 加了 x 鎖,就可以對 a 進行讀取和更新。加鎖期間其它事務不能對 a 加任何鎖。

乙個事務對資料物件 a 加了 s 鎖,可以對 a 進行讀取操作,但是不能進行更新操作。加鎖期間其它事務能對 a 加 s 鎖,但是不能加 x 鎖。

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

乙個事務只能讀取已經提交的事務所做的修改。換句話說,乙個事務所做的修改在提交之前對其它事務是不可見的。

保證在同乙個事務中多次讀取同一資料的結果是一樣的。

強制事務序列執行,這樣多個事務互不干擾,不會出現併發一致性問題。

該隔離級別需要加鎖實現,因為要使用加鎖機制保證同一時間只有乙個事務執行,也就是保證事務序列執行。

隔離級別

髒讀不可重複讀

幻讀未提交讀√√

√提交讀x√

√可重複讀xx

√可序列化xx

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

加鎖能解決多個事務同時執行時出現的併發一致性問題。在實際場景中讀操作往往多於寫操作,因此又引入了讀寫鎖來避免不必要的加鎖操作,例如讀和讀沒有互斥關係。讀寫鎖中讀和寫操作仍然是互斥的,而 mvcc 利用了多版本的思想,寫操作更新最新的版本快照,而讀操作去讀舊版本快照,沒有互斥關係,這一點和 copyonwrite 類似。

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

髒讀和不可重複讀最根本的原因是事務讀取到其它事務未提交的修改。在事務進行讀取操作時,為了解決髒讀和不可重複讀問題,mvcc 規定只能讀取已經提交的快照。當然乙個事務可以讀取自身未提交的快照,這不算是髒讀。

mvcc 的 select 操作是快照中的資料,不需要進行加鎖操作。

mvcc 其它會對資料庫進行修改的操作(insert、update、delete)需要進行加鎖操作,從而讀取最新的資料。可以看到 mvcc 並不是完全不用加鎖,而只是避免了 select 的加鎖操作。

1. 第一正規化 (1nf)

屬性不可分。

2. 第二正規化 (2nf)

每個非主屬性完全函式依賴於鍵碼。

可以通過分解來滿足。

3. 第三正規化 (3nf)

非主屬性不傳遞函式依賴於鍵碼。

資料庫系統原理學習筆記

二 併發一致性問題 三 四種隔離級別 四 多版本併發控制 事務是指滿足acid特性的一組操作。1.原子性 atomicity 事務被視為不可分割的最小單元,事務包含的所有操作要麼全部提交成功,要麼全部失敗回滾。回滾可以用回滾日誌 undo log 來實現,回滾日誌記錄著事務所執行的修改操作,在回滾時...

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

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

資料庫空間管理 學習筆記

sql server 中資料儲存的基本單位是頁 page 磁碟i o 操作在頁級執行。sql server 讀取或寫入資料的最小單位就是以8 kb 為單位的頁。每頁的開頭是乙個96 b 的頁頭,用於儲存有關頁的系統資訊。包括頁碼 頁型別 頁的可用空間,以及擁有該頁 的物件的分配單元id。不同型別的資...