DB2隔離級別與性能如何正確理解?
以下的文章主要是闡述DB2隔離級別與性能,如果你對DB2數(shù)據(jù)庫的隔離級別與性能有興趣了解的話此文章將會揭開它的神秘面紗。希望你在瀏覽完之后會有所收獲。我們大家在實際操作中隔離級別確定訪問數(shù)據(jù)時,如何正確鎖定數(shù)據(jù)或使數(shù)據(jù)不受其他進(jìn)程影響。
該DB2隔離級別將在工作單元運行期間生效。在執(zhí)行 OPEN CURSOR 的工作單元期間。
使用由 WITH HOLD 子句的 DECLARE CURSOR 語句聲明的游標(biāo)的應(yīng)用程序?qū)⒈3诌x定的隔離級別。DB2® 支持下列隔離級別:
可重復(fù)讀
讀穩(wěn)定性
游標(biāo)穩(wěn)定性
未落實的讀。
注: 某些主機數(shù)據(jù)庫服務(wù)器支持不落實隔離級別。對于其他數(shù)據(jù)庫,此隔離級別的行為與未落實的讀隔離級別一樣。
每個DB2隔離級別的詳細(xì)說明按它們對性能的影響程度的降序排列,但按您訪問和更新數(shù)據(jù)時需要加以關(guān)心的程度的升序排列。
可重復(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隔離級別。
評估引用約束時,在一些情況下,DB2 將在內(nèi)部把對外部表進(jìn)行掃描所使用的隔離級別升級到“可重復(fù)讀”(RR),而無論用戶設(shè)置的隔離級別是什么。這將導(dǎo)致其他鎖定在落實之前一直被掛起,從而增大了出現(xiàn)死鎖或鎖定超時的可能性。為了避免出現(xiàn)這種情況,建議您創(chuàng)建僅包含一列或多列外鍵的索引,從而允許 RI 掃描使用此索引。
讀穩(wěn)定性
讀穩(wěn)定性(RS)只鎖定應(yīng)用程序在工作單元中檢索的那些行。它確保在某個工作單元完成之前,在該工作單元運行期間的任何限定行讀取不被其他應(yīng)用程序進(jìn)程更改,且確保不會讀取由另一個應(yīng)用程序進(jìn)程所更改的任何行,直至該進(jìn)程落實了這些更改。也就是說,不可能出現(xiàn)“不可重復(fù)讀”情形。
與可重復(fù)讀不同,使用“讀穩(wěn)定性”時,如果您的應(yīng)用程序多次發(fā)出相同的查詢,那么有可能看到附加的幻像行(幻像讀現(xiàn)象)。重新引用掃描 10000 行的示例時,“讀穩(wěn)定性”只鎖定限定的行。這樣,使用“讀穩(wěn)定性”時,只檢索 10 行,且只對那十行掛起鎖定。將它與“可重復(fù)讀”對比,在本示例中,可重復(fù)讀會在所有的 10000 行上掛起鎖定。掛起的鎖定可以是共享、下次共享、更新或互斥鎖定。
注: “讀穩(wěn)定性”隔離級別確保在應(yīng)用程序看到數(shù)據(jù)之前所有返回的數(shù)據(jù)保持不變,即使使用了臨時表或行分塊也是如此。
“讀穩(wěn)定性”隔離級別的其中一個目標(biāo)是提供較高并行性程度以及數(shù)據(jù)的穩(wěn)定視圖。為了有助于達(dá)到此目標(biāo),優(yōu)化器確保在發(fā)生鎖定升級前不獲取表級鎖定。
“讀穩(wěn)定性”隔離級別最適用于包括下列所有特征的應(yīng)用程序:
在并發(fā)環(huán)境下運行
需要限定某些行在工作單元運行期間保持穩(wěn)定
在工作單元中不會多次發(fā)出相同的查詢,或者在同一工作單元中發(fā)出多次查詢時并不要求該查詢獲得相同的回答。
游標(biāo)穩(wěn)定性
游標(biāo)穩(wěn)定性(CS)當(dāng)在行上定位游標(biāo)時會鎖定任何由應(yīng)用程序的事務(wù)所訪問的行。此鎖定在讀取下一行或終止事務(wù)之前有效。但是,如果更改了某一行上的任何數(shù)據(jù),那么在對數(shù)據(jù)庫落實更改之前必須掛起該鎖定。
對于具有“游標(biāo)穩(wěn)定性”的應(yīng)用程序已檢索的行,當(dāng)該行上有任何可更新的游標(biāo)時,任何其他應(yīng)用程序都不能更新或刪除該行。“游標(biāo)穩(wěn)定性”應(yīng)用程序不能查看其他應(yīng)用程序的未落實更改。
再次引用掃描 10000 行的示例,如果使用“游標(biāo)穩(wěn)定性”,將只鎖定當(dāng)前游標(biāo)位置以下的行。當(dāng)游標(biāo)移離該行時,也就除去了該鎖定(除非更新該行)。
使用“游標(biāo)穩(wěn)定性”,可能會出現(xiàn)不可重復(fù)讀和幻像讀現(xiàn)象。“游標(biāo)穩(wěn)定性”是缺省DB2隔離級別,且應(yīng)在需要***并行性,但只看到其他應(yīng)用程序中的已落實行的情況下才使用。
未落實的讀
未落實的讀(UR)允許應(yīng)用程序訪問其他事務(wù)的未落實的更改。除非其他應(yīng)用程序嘗試刪除或改變該表,否則該應(yīng)用程序也不會鎖定正讀取的行而使其他應(yīng)用程序不能訪問該行。對于只讀和可更新的游標(biāo),“未落實的讀”的工作方式有所不同。
只讀游標(biāo)可訪問大多數(shù)其他事務(wù)的未落實的更改。但是,當(dāng)該事務(wù)正在處理時,正由其他事務(wù)創(chuàng)建或刪除的表、視圖和索引不能使用。其他事務(wù)的任何其他更改在落實或回滾前都可被讀取。
注: “未落實的讀”隔離級別下的可更新操作的游標(biāo)將按隔離級別是游標(biāo)穩(wěn)定性的方式工作。
當(dāng)它使用隔離級別 UR 運行程序時,應(yīng)用程序可以使用隔離級別 CS。發(fā)生這種情況的原因是因為在應(yīng)用程序中使用的游標(biāo)是模糊游標(biāo)。由于 BLOCKING 選項,可以將模糊游標(biāo)升級為隔離級別 CS。BLOCKING 選項的缺省值是 UNAMBIG。這意味著將模糊游標(biāo)當(dāng)作可更新的,并且隔離級別升級為 CS。要防止此升級,有兩種選擇:
修改應(yīng)用程序中的游標(biāo)。以便這些游標(biāo)是非模糊游標(biāo)。將 SELECT 語句更改為包括 FOR READ ONLY 子句。
將模糊游標(biāo)保留在應(yīng)用程序中,但是預(yù)編譯程序或使用 BLOCKING ALL 和 STATICREADONLY YES 選項綁定它以允許在運行該程序時將任何模糊游標(biāo)視為只讀游標(biāo)。
如對掃描 10000 行的“可重復(fù)讀”給出的示例一樣,如果使用“未落實的讀”,那么不需要任何行鎖定。
使用“未落實的讀”,可能出現(xiàn)不可重復(fù)讀行為和幻像讀現(xiàn)象。“未落實的讀”DB2隔離級別最常用于只讀表上的查詢,或者若僅執(zhí)行選擇語句且不關(guān)心是否可從其他應(yīng)用程序中看到未落實的數(shù)據(jù)時也最常用。
隔離級別的摘要
下表按不期望的結(jié)果概述了幾個不同的隔離級別。
表 1. 隔離級別摘要
隔離級別 訪問未落實的數(shù)據(jù) 不可重復(fù)讀 幻像讀現(xiàn)象
可重復(fù)讀(RR) 不可能 不可能 不可能
穩(wěn)定性(RS) 不可能 不可能 可能
游標(biāo)穩(wěn)定性(CS) 不可能 可能 可能
未落實的讀(UR) 可能 可能 可能
下表提供了簡單的試探方法,以幫助您為應(yīng)用程序選擇初始隔離級別。首先考慮下表列示的方法,并參閱先前對各級因素的討論,可能會找到另一個更適合的隔離級別。
表 2. 選擇隔離級別的準(zhǔn)則
應(yīng)用程序類型 需要高數(shù)據(jù)穩(wěn)定性 不需要高數(shù)據(jù)穩(wěn)定性
讀寫事務(wù) RS CS
只讀事務(wù) RR 或 RS UR
為一個應(yīng)用程序選擇適當(dāng)?shù)母綦x級別對于該應(yīng)用程序避免無法容忍的現(xiàn)象很重要。因為獲取和釋放鎖定所需的 CPU 和內(nèi)存資源隨隔離級別的不同而不同,所以此隔離級別不但影響應(yīng)用程序之間的隔離程度,而且還影響個別應(yīng)用程序的性能特征。潛在的死鎖情況隨DB2隔離級別的不同而不同。
【編輯推薦】
- DB2用戶密碼修改與備份恢復(fù)的正確應(yīng)用
- DB2表格操作技巧之導(dǎo)出LOB數(shù)據(jù),很簡單!
- DB2未使用索引的查找方案描述
- DB2數(shù)據(jù)庫性能理解的主要誤區(qū)有哪些?如何避免?
- DB2數(shù)據(jù)庫優(yōu)化時哪些策略少不了?