DB2隔離級別--可重復(fù)讀
下面為您介紹的DB2隔離級別,是可重復(fù)讀級別,作為重要的DB2隔離級別之一,利用可重復(fù)讀,不可能出現(xiàn)丟失更新、訪問未落實的數(shù)據(jù)和幻像行的情況。
可重復(fù)讀
可重復(fù)讀(RR)會鎖定應(yīng)用程序在工作單元中引用的所有行。利用“可重復(fù)讀”,在打開游標(biāo)的相同工作單元內(nèi)一個應(yīng)用程序發(fā)出一個 SELECT 語句兩次,每次都返回相同的結(jié)果。利用“可重復(fù)讀”,不可能出現(xiàn)丟失更新、訪問未落實的數(shù)據(jù)和幻像行的情況。
在該工作單元完成之前,“可重復(fù)讀”應(yīng)用程序可以盡可能多次地檢索和操作這些行。但是,在該工作單元完成之前其他應(yīng)用程序均不能更新、刪除或插入可能會影響結(jié)果表的行?!翱芍貜?fù)讀”應(yīng)用程序不能查看其他應(yīng)用程序的未落實更改。
利用“可重復(fù)讀”,將會鎖定引用的每一行,而不僅僅是檢索的那些行。執(zhí)行了適當(dāng)?shù)逆i定,因此其他應(yīng)用程序不能插入或更新行(該行可能要添加到查詢所引用的行的列表中,如果重新執(zhí)行查詢)。這將防止出現(xiàn)幻像行。例如,如果您掃描 10000 行并對它們應(yīng)用謂詞,盡管只有 10 行滿足條件,但仍會鎖定全部的 10000 行。
注: “可重復(fù)讀”隔離級別確保在應(yīng)用程序看到數(shù)據(jù)之前所有返回的數(shù)據(jù)都保持不變,即使使用了臨時表或行分塊也是如此。
由于“可重復(fù)讀”可能獲得和掛起大量鎖定,因此這些鎖定可能超出可作為 locklist 和 maxlocks 配置參數(shù)的有效結(jié)果的鎖定數(shù)。為了避免鎖定升級,優(yōu)化器在認(rèn)為很可能會發(fā)生鎖定升級的時候,可能選擇立即獲得單個表級別鎖定用于索引掃描。這就像數(shù)據(jù)庫管理器代表您發(fā)出了一個 LOCK TABLE 語句一樣。如果不想獲得表級別鎖定,確保有足夠的鎖定可用于該事務(wù)或使用“讀穩(wěn)定性”隔離級別。
評估引用約束時,在一些情況下,DB2 將在內(nèi)部把對外部表進(jìn)行掃描所使用的DB2隔離級別升級到“可重復(fù)讀”(RR),而無論用戶設(shè)置的DB2隔離級別是什么。這將導(dǎo)致其他鎖定在落實之前一直被掛起,從而增大了出現(xiàn)死鎖或鎖定超時的可能性。為了避免出現(xiàn)這種情況,建議您創(chuàng)建僅包含一列或多列外鍵的索引,從而允許 RI 掃描使用此索引。
【編輯推薦】
帶您學(xué)習(xí)DB2數(shù)據(jù)倉庫中心