SQL 系列
資料庫學習一 資料庫導論: https://blog.yexca.net/zh-tw/archives/86
資料庫學習二 關聯模型: https://blog.yexca.net/zh-tw/archives/87
資料庫學習三 SQL 語言: https://blog.yexca.net/zh-tw/archives/88
資料庫學習四 關聯式資料庫理論: https://blog.yexca.net/zh-tw/archives/89
資料庫學習五 範式: https://blog.yexca.net/zh-tw/archives/90
資料庫學習六 資料庫設計: https://blog.yexca.net/zh-tw/archives/91
資料庫學習七 資料庫的控制功能: 本文
交易管理
交易是一個操作序列,這些操作「要麼全部執行,要麼全部不執行」。
交易和程式是兩個不同的概念,通常一個程式可包含多個交易。
在 SQL 語言中,定義交易的敘述有以下三條:
| |
交易具有 ACID 特性:原子性 (Atomicity)、一致性 (Consistency)、隔離性 (Isolation) 和持久性 (Durability)。
- 1 原子性
交易是原子的,要麼全部執行,要麼全部不執行。
- 2 一致性
交易執行的結果必須保證資料庫從一個一致性狀態轉換到另一個一致性狀態。
因此,當資料庫只包含成功提交交易的結果時,稱資料庫處於一致性狀態。
- 3 隔離性
交易相互隔離。
當多個交易並行執行時,任一交易的更新操作,直到其成功提交的整個過程,對其他交易都是不可見的。
- 4 持久性
一旦交易成功提交,即使資料庫崩潰,其對資料庫的更新操作也將永久有效。
資料庫的備份與復原
在資料庫的運行過程中,難免會出現電腦系統的軟硬體故障。這些故障會影響資料庫中資料的正確性,甚至破壞資料庫,導致資料庫中的全部或部分資料遺失。因此,資料庫的關鍵技術在於建立冗餘資料,也就是備份資料。如何在系統出現故障後,能夠及時地使資料庫回復到故障前的正確狀態,就是資料庫復原技術。
錯誤類型
資料庫中的四類錯誤:
- 1 交易內部錯誤
採取 REDO 重做與 UNDO 復原技術。
- 2 系統錯誤 DBMS
系統突然停止運作,系統需重新啟動。
- 3 媒體錯誤
硬體損壞
- 4 電腦病毒
備份方法
復原的基本原理是「建立資料冗餘」(重複儲存)。建立冗餘資料的方法是進行資料傾印(Data Dump)和登錄日誌檔。資料的傾印分為靜態傾印和動態傾印、大量傾印和增量傾印,以及日誌檔。
- 1 靜態傾印和動態傾印
靜態傾印是指在傾印期間不允許對資料庫進行任何存取、修改操作。
動態傾印是在傾印期間允許對資料庫進行存取、修改操作。
因此,傾印和使用者交易可並行執行。
- 2 大量傾印和增量傾印
大量傾印是指每次傾印全部資料。
增量傾印是指每次只傾印上次傾印後更新過的資料。
- 3 日誌檔
在交易處理的過程中,DBMS (資料庫管理系統) 會將交易開始、交易結束以及對資料庫的插入、刪除和修改的每一次操作寫入日誌檔。一旦發生錯誤,DBMS 的復原子系統會利用日誌檔撤銷交易對資料庫的改變,回復到交易的初始狀態。因此,DBMS 會利用日誌檔來進行交易錯誤復原和系統錯誤復原,並可協助備份副本進行媒體錯誤復原。
復原
- 交易復原有以下三個步驟:
- 反向掃描日誌檔(即從最後往前掃描日誌檔),查找該交易的更新操作。
- 對交易的更新操作執行逆向操作。
- 繼續反向掃描日誌檔,查找該交易的其他更新操作,並做同樣的處理,直到交易的開始標誌。
亦即,若交易異常終止,則撤銷之前的所有操作。
- 系統錯誤的復原
尚未執行完畢的交易執行 UNDO (復原),遺失的交易執行 REDO (重做)。
- 媒體錯誤的復原
重新載入資料庫,重做已經完成的交易。
並行控制
並行操作帶來的問題
- 1 遺失修改
我修改的東西沒有生效。例如我把網站的 logo 改了,結果顯示的還是原本的。
- 2 不可重複讀取
我在一個交易中,連續兩次讀取的資料不同。 例如我剛開始讀取到的銀行餘額為 10 元。此時公司突然發薪 100 元,那麼第二次讀取就會變成 110 元。
- 3 讀取髒資料
我要讀取欄位 A、B,但讀取時其他使用者正在更新這兩個欄位。 如果他更新到一半我就讀取(更新了 A,正在更新 B),此時讀取的資料就是髒資料。
並行控制技術
並行控制的主要技術是鎖定。基本鎖定的類型有互斥鎖(簡稱 X 鎖或寫入鎖)和共用鎖(簡稱 S 鎖或讀取鎖)。
- 1 互斥鎖
若交易 T 對資料物件 A 加上 X 鎖,則只允許 T 讀取和修改 A,其他交易都不能再對 A 加任何類型的鎖,直到 T 釋放 A 上的鎖。
- 2 共用鎖
若交易 T 對資料物件 A 加上 S 鎖,則只允許 T 讀取 A,但不能修改 A,其他交易只能再對 A 加 S 鎖,直到 T 釋放 A 上的 S 鎖。這就保證了其他交易可以讀取 A,但在 T 釋放 A 上的 S 鎖之前不能對 A 進行任何修改。
鎖定協定
- 第一級鎖定協定(解決遺失修改)
修改時,必須加上 X 鎖,直到結束。
- 第二級鎖定協定(解決讀取髒資料)
讀取時,加上 S 鎖,用完就釋放。
- 第三級鎖定協定(解決不可重複讀取)
讀取時,加上 S 鎖,直到結束。
可序列化性
假設多種情況皆可,然後獲得結果。 如果並行執行的結果與上述結果中任一個相同即可。
交易 T1:讀取 B,A = B + 1,寫回 A。 交易 T2:讀取 A,B = A + 1,寫回 B。
那麼結果假設先執行 T1,再執行 T2,則 A = 4,B = 3; 假設先執行 T2,再執行 T1,則 A = 3,B = 4。 這個並行執行滿足可序列化性。
分散式資料庫
- 分區透明
使用者或應用程式不需要知道邏輯上存取的表格具體是如何分塊儲存的。
- 複製透明
採用複製技術的分散式方法,使用者不需要知道資料是複製到哪些節點,以及如何複製的。
- 位置透明
使用者無需知道資料存放的實體位置。
- 邏輯透明
使用者或應用程式無需知道局部場地使用的是哪種資料模型。
- 共享性
資料儲存在不同的節點,資料共享。
- 自治性
每個節點都能對本地資料進行獨立管理。
- 可用性
當某一場地發生錯誤時,系統可以使用其他場地上的副本,而不至於使整個系統癱瘓。
- 分散性
資料在不同場地上的儲存。