数据库事务和并发控制
事務特征(ACID):
并發產生問題:
數據庫的隔離級別:
并發控制的技術:
數據庫鎖
排它鎖(X鎖):寫鎖,一個事務獲取了寫鎖,則其他事務都不能再加任何類型的鎖,直到鎖釋放。
共享鎖(S鎖):讀鎖,一個事務獲取了讀鎖,其他事務能加讀鎖,不能加寫鎖。
(1) 鎖協議:
1、一級封鎖協議:事務在修改數據前先加寫鎖,直到事務結束。(防止更新丟失)
2、二級封鎖協議:在一級的基礎上,事務讀數據先加讀鎖,讀完釋放讀鎖。(防止臟讀)
3、三級封鎖協議:在一級的基礎上,事務讀數據先加讀鎖,直到事務結束釋放。(防止不可重復讀)
(2)兩端封鎖協議:事務執行過程中,不允許加鎖釋放鎖交叉執行。
加鎖階段:在該階段可以進行加鎖操作。在對任何數據進行讀操作之前要申請并獲得S鎖,在進行寫操作之前要申請并獲得X鎖。加鎖不成功,則事務進入等待狀態,直到加鎖成功才繼續執行。
解鎖階段:當事務釋放了一個封鎖以后,事務進入解鎖階段,在該階段只能進行解鎖操作不能再進行加鎖操作。
兩段封鎖法可以這樣來實現:事務開始后就處于加鎖階段,一直到執行ROLLBACK和COMMIT之前都是加鎖階段。ROLLBACK和COMMIT使事務進入解鎖階段
(3)InnoDB行鎖算法:
行記錄鎖:
間隙鎖:鎖定一個范圍。
next-key lock: 鎖定一個范圍,并鎖定記錄。
寫時復制:讀操作一般遠遠超過寫操作,COW讀操作不用加鎖,極大提高讀取性能。
多版本并發控制
MVCC可以提供基于某個時間點的快照,使得對于事務看來,總是可以提供與事務開始時刻相一致的數據,而不管這個事務執行的時間有多長.所以在不同的事務看來,同一時刻看到的相同行的數據可能是不一樣的,即一個行可能有多個版本。
為了實現mvcc, innodb對每一行都加上了兩個隱含的列,其中一列存儲行被更新的”時間”,另外一列存儲行被刪除的”時間”. 但是innodb存儲的并不是絕對的時間,而是與時間對應的數據庫系統的版本號,每當一個事務開始的時候,innodb都會給這個事務分配一個遞增的版本號,所以版本號也可以被認為是事務號.對于每一個”查詢”語句,innodb都會把這個查詢語句的版本號同這個查詢語句遇到的行的版本號進行對比,然后結合不同的事務隔離等級,來決定是否返回該行.
鎖帶來的問題:
1、活鎖:
某一事務一直在等待鎖。采用先來先服務的策略。
2、死鎖:
事務互相等待鎖。
預防:一次將所有需要的數據全部加鎖;規定一個封鎖順序
診斷死鎖并解除:超時法;等待圖法,如果有環則有死鎖。解除死鎖:選擇回滾代價最小的事務;回滾多遠;避免餓死。
鎖的粒度越大,能夠封鎖的單元就越少,其并發度越低,系統開銷越小。一個系統支持多個封鎖粒度供不同的事務選擇,叫多粒度封鎖。
多粒度鎖協議:對一個結點加鎖意味著這個節點的所有后裔節點都被加同樣的鎖。顯示封鎖:直接加到數據對象的鎖,隱式封鎖:該數據對象是由于上級節點加鎖而加上的鎖。
意向鎖:對任意節點加鎖,就必須先對它的上層節點加意向鎖。意向共享鎖,意向排他所,共享意向排他鎖。
總結
以上是生活随笔為你收集整理的数据库事务和并发控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库存储模型-数据存储
- 下一篇: 数据库故障恢复技术