一、事務
事務指的是滿足acid特性的一組操作,可以通過 commit提交乙個事務,也可以使用 rollback 進行回滾。
mysql 預設採用自動提交模式。也就是說,如果不顯式使用start transaction
語句來開始乙個事務,那麼每個查詢都會被當做乙個事務自動提交。
acid
1. 原子性(atomicity)
事務被視為不可分割的最小單元,事務的所有操作要麼全部提交成功,要麼全部失敗回滾。
回滾可以用回滾日誌來實現,回滾日誌記錄著事務所執行的修改操作,在回滾時反向執行這些修改操作即可。
2. 一致性(consistency)
在事務執行前後資料庫的完整性約束沒有被破壞。
應用系統從乙個正確的狀態到另乙個正確的狀態,滿足某種約束條件。例如銀行轉賬系統,每次轉賬結束後,總錢數是一致的。
3. 隔離性(isolation)
乙個事務所做的修改在最終提交以前,對其它事務是不可見的。
4. 永續性(durability)
一旦事務提交,則其所做的修改將會永遠儲存到資料庫中。即使系統發生崩潰,事務執行的結果也不能丟失。
使用重做日誌來保證永續性。
二、併發一致性問題(四種)
丟失修改
t1 和 t2 兩個事務都對乙個資料進行修改,t1先修改,t2 隨後修改,t2 的修改覆蓋了 t1 的修改。
讀髒資料
t1 修改乙個資料,t2 隨後讀取這個資料。如果 t1撤銷了這次修改,那麼 t2 讀取的資料是髒資料。
不可重複讀
t2 讀取乙個資料,t1 對該資料做了修改。如果 t2再次讀取這個資料,此時讀取的結果和第一次讀取的結果不同。(避免不可重複讀需要鎖行就行)
幻影讀t1 讀取某個範圍的資料,t2在這個範圍內插入新的資料,t1再次讀取這個範圍的資料,此時讀取的結果和第一次讀取的結果不同。(避免幻影讀則需要鎖表)
產生併發不一致性問題主要原因是破壞了事務的隔離性,解決方法是通過併發控制來保證隔離性。併發控制可以通過封鎖來實現,但是封鎖操作需要使用者自己控制,相當複雜。資料庫管理系統提供了事務的隔離級別,讓使用者以一種更輕鬆的方式處理併發一致性問題。
三、事務的隔離級別
未提交讀(read uncommitted)
事務中的修改,即使沒有提交,對其它事務也是可見的。
處理了丟失修改。
提交讀(read committed)
乙個事務只能讀取已經提交的事務所做的修改。換句話說,乙個事務所做的修改在提交之前對其它事務是不可見的。
處理了丟失修改,髒讀。
可重複讀(repeatable read)
保證在同乙個事務中多次讀取同樣資料的結果是一樣的。
處理了丟失修改,髒讀,不可重複讀。
可序列化(serializable)
強制事務序列執行。
處理了丟失修改,髒讀,不可重複讀,幻影讀。
四、封鎖
mysql 中提供了兩種封鎖粒度:行級鎖以及表級鎖。行級鎖只在儲存引擎層實現。
每種mysql儲存引擎都可以實現自己的鎖策略和鎖粒度。
應該盡量只鎖定需要修改的那部分資料,而不是所有的資源。鎖定的資料量越少,發生鎖爭用的可能就越小,系統的併發程度就越高。
但是加鎖需要消耗資源,鎖的各種操作(包括獲取鎖、釋放鎖、以及檢查鎖狀態)都會增加系統開銷。因此封鎖粒度越小,系統開銷就越大。
在選擇封鎖粒度時,需要在鎖開銷和併發程度之間做乙個權衡。
4.1 封鎖型別
讀寫鎖
意向鎖
注意:ix/is 都是表鎖,用來表示乙個事務想要在表中的某個資料行上加 x 鎖或 s 鎖。
4.2 封鎖協議
4.2.1 **封鎖協議
一級封鎖協議
事務 t 要修改資料a 時必須加 x 鎖,直到 t 結束才釋放鎖。
可以解決丟失修改問題,因為不能同時有兩個事務對同乙個資料進行修改,那麼事務的修改就不會被覆蓋。
二級封鎖協議
在一級的基礎上,要求讀取資料a 時必須加 s 鎖,讀取完馬上釋放 s 鎖。
可以解決讀髒資料問題,因為如果乙個事務在對資料 a 進行修改,根據 1 級封鎖協議,會加 x 鎖,那麼就不能再加 s 鎖了,也就是不會讀入資料。
**封鎖協議
在二級的基礎上,要求讀取資料a 時必須加 s 鎖,直到事務結束了才能釋放 s 鎖。
可以解決不可重複讀的問題,因為讀 a 時,其它事務不能對 a 加 x 鎖,從而避免了在讀的期間資料發生改變。
五、關聯式資料庫設計理論
高階別正規化的依賴於低階別的正規化。
1. 第一正規化 (1nf)
屬性不可分。
2. 第二正規化 (2nf)
在一正規化的基礎上,每個非主屬性完全函式依賴於鍵碼。
部分函式依賴是屬性只依賴於鍵碼中的一部分。
3. 第三正規化 (3nf)
在二正規化的基礎上,非主屬性不傳遞函式依賴於鍵碼。
參考自cs-notes
資料庫事務及隔離級別
1資料庫四大特性 資料庫具有事務安全性,同時也具有acid四大特性 原子性 一致性 隔離性 永續性 原子性 atomicity 原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾,這和前面兩篇部落格介紹事務的功能是一樣的概念,因此事務的操作如果成功就必須要完全應用到資料庫,如果操作失敗則不能...
資料庫事務及隔離級別
1 原子性 atomicity 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間環節。事務執行過程 錯,會回滾到事務開始前的狀態,所有的操作就像沒有發生一樣。也就是說事務是乙個不可分割的整體,就像化學中學過的原子,是物質構成的基本單位。2 一致性 consistency 事務開始前和...
資料庫事務及隔離級別
a.概念 b.操作 c.測試 建立賬戶表 create table account id int primary keyauto increment name varchar 10 money double 新增資料 insert into account name,money values zha...