徐愛蕓



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