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