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