徐愛蕓
摘要:為了充分利用系統(tǒng)資源,發(fā)揮共享資源的特點(diǎn),數(shù)據(jù)庫(kù)系統(tǒng)允許執(zhí)行多個(gè)并發(fā)事務(wù),在任何給定的時(shí)刻有可達(dá)數(shù)百個(gè)正在執(zhí)行的卻只部分完成的事務(wù),這是由用戶來(lái)選擇一個(gè)可以保證應(yīng)用程序正確執(zhí)行并且能夠使并發(fā)度最大的隔離級(jí)別的執(zhí)行選項(xiàng)。
關(guān)鍵詞:事務(wù);隔離級(jí)別;并發(fā)執(zhí)行;并發(fā)控制
數(shù)據(jù)庫(kù)系統(tǒng)的最大特點(diǎn)是共享,允許多個(gè)用戶或多種應(yīng)用相互覆蓋地共享數(shù)據(jù)集合。在互聯(lián)網(wǎng)時(shí)代,成千上萬(wàn)的不同地點(diǎn)的計(jì)算機(jī)每秒執(zhí)行上百的操作,同一時(shí)間有多個(gè)操作影響同一數(shù)據(jù),即存在并發(fā)操作,如果不加以控制,可能帶來(lái)數(shù)據(jù)不一致問題:更新丟失;不可重復(fù)讀;讀臟數(shù)據(jù)。為保證并發(fā)事務(wù)執(zhí)行時(shí)數(shù)據(jù)的正確性和一致性,對(duì)并發(fā)事務(wù)要進(jìn)行控制。
1 事務(wù)管理器
負(fù)責(zé)事務(wù)的正確執(zhí)行是事務(wù)管理器,它接受來(lái)自應(yīng)用的命令,包括BEGIN TRANSACATION、COMMIT、ROLLBACK,而將事務(wù)操作傳給日志管理器。并發(fā)控制管理器對(duì)并發(fā)執(zhí)行的事務(wù)進(jìn)行控制,通過(guò)加鎖和封鎖協(xié)議保證并發(fā)執(zhí)行的事務(wù)保持隔離性。其流程如圖1所示。
2 事務(wù)隔離級(jí)別
在實(shí)際開發(fā)中,直接操作數(shù)據(jù)庫(kù)中各種鎖的幾率相對(duì)比較少,更多的是利用數(shù)據(jù)庫(kù)提供的四個(gè)隔離級(jí)別:未提交讀、已提交讀、可重復(fù)讀、可序列化,用隔離封裝鎖。隔離級(jí)別從上到下依次增加,級(jí)別越低,引起的問題也就比較多,比如臟讀、丟失更新等;隔離級(jí)別越高,需要管理更多的鎖,無(wú)法并行處理,性能方面又受損。在實(shí)際的系統(tǒng)中只需要根據(jù)業(yè)務(wù)需求選擇一種當(dāng)適合的隔離級(jí)別。一種隔離級(jí)別,就有一套利用鎖的方案,如此設(shè)計(jì)的目的就是為了平衡性能和功能。
2.1 讀未提交(Read Uncommitted)
“讀未提交”提供了事務(wù)之間最小限度的隔離,事務(wù)沒有獲得讀鎖也可以執(zhí)行該操作,事務(wù)可以讀取其它事務(wù)已經(jīng)在其上加過(guò)寫鎖的數(shù)據(jù),即允許臟讀。其實(shí)現(xiàn)的機(jī)制通過(guò)實(shí)驗(yàn)驗(yàn)證,過(guò)程如表1所示。
未提交讀不允許更新丟失,如果一個(gè)事務(wù)已經(jīng)開始寫數(shù)據(jù),則另外一個(gè)數(shù)據(jù)則不允許同時(shí)進(jìn)行寫操作,該隔離級(jí)別可以通過(guò)排它鎖實(shí)現(xiàn)。
2.2 讀已提交(Read Committed)
“讀已提交”只能讀提交的數(shù)據(jù),不允許臟讀,但允許不可重復(fù)讀。這可以通過(guò)共享鎖和排它鎖實(shí)現(xiàn)。讀取數(shù)據(jù)的事務(wù)允許其它事務(wù)繼續(xù)訪問該行數(shù)據(jù),但是未提交的寫事務(wù)將會(huì)禁止其他事務(wù)訪問該行。其實(shí)現(xiàn)的機(jī)制通過(guò)實(shí)驗(yàn)驗(yàn)證,過(guò)程如表2所示。
2.3 可重復(fù)讀(Repeatable Read)
“可重復(fù)讀”通過(guò)共享鎖和排它鎖實(shí)現(xiàn),讀取數(shù)據(jù)的事務(wù)將會(huì)禁止寫事務(wù)(但允許讀事務(wù)),寫事務(wù)則禁止任何其它事務(wù),禁止不可重復(fù)讀和臟讀。其實(shí)現(xiàn)的機(jī)制通過(guò)實(shí)驗(yàn)驗(yàn)證,過(guò)程如表3所示。
2.4 序列化(Serializable)
“序列化”提供嚴(yán)格的事務(wù)隔離,它要求事務(wù)序列化執(zhí)行,事務(wù)只能一個(gè)接著一個(gè)地執(zhí)行,但不能并發(fā)執(zhí)行。如果僅僅通過(guò)“行級(jí)鎖”是無(wú)法實(shí)現(xiàn)事務(wù)序列化的,必須通過(guò)其他機(jī)制保證新插入的數(shù)據(jù)不會(huì)被剛執(zhí)行查詢操作的事務(wù)訪問到。
3 結(jié)語(yǔ)
隔離級(jí)別越高,越能保證數(shù)據(jù)的完整性和一致性,但是對(duì)并發(fā)性能的影響也越大。對(duì)于多數(shù)應(yīng)用程序,可以優(yōu)先考慮把數(shù)據(jù)庫(kù)系統(tǒng)的隔離級(jí)別設(shè)為Read Committed,它能夠避免讀臟數(shù)據(jù),而且具有較好的并發(fā)性能。盡管它會(huì)導(dǎo)致不可重復(fù)讀、虛讀這些并發(fā)問題,在可能出現(xiàn)這類問題的個(gè)別場(chǎng)合,可以由應(yīng)用程序采用悲觀鎖或樂觀鎖來(lái)控制。
參考文獻(xiàn):
[1] 送金玉,陳萍,陳剛.數(shù)據(jù)庫(kù)原理與應(yīng)用(第2版)[M].清華大學(xué)出版社,2011(06).
[2] 尹為民,數(shù)據(jù)庫(kù)原理與技術(shù)(第2版)[M].科學(xué)出版社,2010(01).
(作者單位:江漢大學(xué)數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院)