新聞中心
以下的文章主要是闡述DB2隔離級別與性能,如果你對DB2數(shù)據(jù)庫的隔離級別與性能有興趣了解的話此文章將會揭開它的神秘面紗。希望你在瀏覽完之后會有所收獲。我們大家在實(shí)際操作中隔離級別確定訪問數(shù)據(jù)時,如何正確鎖定數(shù)據(jù)或使數(shù)據(jù)不受其他進(jìn)程影響。

成都創(chuàng)新互聯(lián)是一家成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),提供網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,網(wǎng)站制作,建網(wǎng)站,按需網(wǎng)站設(shè)計,網(wǎng)站開發(fā)公司,自2013年起是互聯(lián)行業(yè)建設(shè)者,服務(wù)者。以提升客戶品牌價值為核心業(yè)務(wù),全程參與項(xiàng)目的網(wǎng)站策劃設(shè)計制作,前端開發(fā),后臺程序制作以及后期項(xiàng)目運(yùn)營并提出專業(yè)建議和思路。
該DB2隔離級別將在工作單元運(yùn)行期間生效。在執(zhí)行 OPEN CURSOR 的工作單元期間。
使用由 WITH HOLD 子句的 DECLARE CURSOR 語句聲明的游標(biāo)的應(yīng)用程序?qū)⒈3诌x定的隔離級別。DB2? 支持下列隔離級別:
可重復(fù)讀
讀穩(wěn)定性
游標(biāo)穩(wěn)定性
未落實(shí)的讀。
注: 某些主機(jī)數(shù)據(jù)庫服務(wù)器支持不落實(shí)隔離級別。對于其他數(shù)據(jù)庫,此隔離級別的行為與未落實(shí)的讀隔離級別一樣。
每個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í)的數(shù)據(jù)和幻像行的情況。
在該工作單元完成之前,“可重復(fù)讀”應(yīng)用程序可以盡可能多次地檢索和操作這些行。但是,在該工作單元完成之前其他應(yīng)用程序均不能更新、刪除或插入可能會影響結(jié)果表的行?!翱芍貜?fù)讀”應(yīng)用程序不能查看其他應(yīng)用程序的未落實(shí)更改。
利用“可重復(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)致其他鎖定在落實(shí)之前一直被掛起,從而增大了出現(xiàn)死鎖或鎖定超時的可能性。為了避免出現(xiàn)這種情況,建議您創(chuàng)建僅包含一列或多列外鍵的索引,從而允許 RI 掃描使用此索引。
讀穩(wěn)定性
讀穩(wěn)定性(RS)只鎖定應(yīng)用程序在工作單元中檢索的那些行。它確保在某個工作單元完成之前,在該工作單元運(yùn)行期間的任何限定行讀取不被其他應(yīng)用程序進(jìn)程更改,且確保不會讀取由另一個應(yīng)用程序進(jìn)程所更改的任何行,直至該進(jìn)程落實(shí)了這些更改。也就是說,不可能出現(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)境下運(yùn)行
需要限定某些行在工作單元運(yù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ù)庫落實(shí)更改之前必須掛起該鎖定。
對于具有“游標(biāo)穩(wěn)定性”的應(yīng)用程序已檢索的行,當(dāng)該行上有任何可更新的游標(biāo)時,任何其他應(yīng)用程序都不能更新或刪除該行?!坝螛?biāo)穩(wěn)定性”應(yīng)用程序不能查看其他應(yīng)用程序的未落實(shí)更改。
再次引用掃描 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)用程序中的已落實(shí)行的情況下才使用。
未落實(shí)的讀
未落實(shí)的讀(UR)允許應(yīng)用程序訪問其他事務(wù)的未落實(shí)的更改。除非其他應(yīng)用程序嘗試刪除或改變該表,否則該應(yīng)用程序也不會鎖定正讀取的行而使其他應(yīng)用程序不能訪問該行。對于只讀和可更新的游標(biāo),“未落實(shí)的讀”的工作方式有所不同。
只讀游標(biāo)可訪問大多數(shù)其他事務(wù)的未落實(shí)的更改。但是,當(dāng)該事務(wù)正在處理時,正由其他事務(wù)創(chuàng)建或刪除的表、視圖和索引不能使用。其他事務(wù)的任何其他更改在落實(shí)或回滾前都可被讀取。
注: “未落實(shí)的讀”隔離級別下的可更新操作的游標(biāo)將按隔離級別是游標(biāo)穩(wěn)定性的方式工作。
當(dāng)它使用隔離級別 UR 運(yùn)行程序時,應(yīng)用程序可以使用隔離級別 CS。發(fā)生這種情況的原因是因?yàn)樵趹?yīng)用程序中使用的游標(biāo)是模糊游標(biāo)。由于 BLOCKING 選項(xiàng),可以將模糊游標(biāo)升級為隔離級別 CS。BLOCKING 選項(xiàng)的缺省值是 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 選項(xiàng)綁定它以允許在運(yùn)行該程序時將任何模糊游標(biāo)視為只讀游標(biāo)。
如對掃描 10000 行的“可重復(fù)讀”給出的示例一樣,如果使用“未落實(shí)的讀”,那么不需要任何行鎖定。
使用“未落實(shí)的讀”,可能出現(xiàn)不可重復(fù)讀行為和幻像讀現(xiàn)象。“未落實(shí)的讀”DB2隔離級別最常用于只讀表上的查詢,或者若僅執(zhí)行選擇語句且不關(guān)心是否可從其他應(yīng)用程序中看到未落實(shí)的數(shù)據(jù)時也最常用。
隔離級別的摘要
下表按不期望的結(jié)果概述了幾個不同的隔離級別。
表 1. 隔離級別摘要
隔離級別 訪問未落實(shí)的數(shù)據(jù) 不可重復(fù)讀 幻像讀現(xiàn)象
可重復(fù)讀(RR) 不可能 不可能 不可能
穩(wěn)定性(RS) 不可能 不可能 可能
游標(biāo)穩(wěn)定性(CS) 不可能 可能 可能
未落實(shí)的讀(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)象很重要。因?yàn)楂@取和釋放鎖定所需的 CPU 和內(nèi)存資源隨隔離級別的不同而不同,所以此隔離級別不但影響應(yīng)用程序之間的隔離程度,而且還影響個別應(yīng)用程序的性能特征。潛在的死鎖情況隨DB2隔離級別的不同而不同。
當(dāng)前標(biāo)題:DB2隔離級別與性能如何正確理解?
本文鏈接:http://fisionsoft.com.cn/article/dhijspj.html


咨詢
建站咨詢
