DB2數(shù)據(jù)庫(kù)中的每個(gè)鎖在內(nèi)存中都需要一定的內(nèi)存空間,為了減少鎖需要的內(nèi)存開(kāi)銷,DB2提供了鎖升級(jí)功能。鎖升級(jí)通過(guò)對(duì)表加上非意圖性的表鎖,同時(shí)釋放行鎖來(lái)減少鎖的數(shù)目,從而達(dá)到減少鎖所需要的內(nèi)存開(kāi)銷的目的。鎖升級(jí)是數(shù)據(jù)庫(kù)管理器自動(dòng)完成,但是有兩個(gè)數(shù)據(jù)庫(kù)配置參數(shù)直接影響著鎖升級(jí)的處理:
Locklist : 數(shù)據(jù)庫(kù)全局內(nèi)存中用于存的內(nèi)存,單位是頁(yè)(4k)
Maxlocks:允許某個(gè)應(yīng)用程序所有的鎖所使用的內(nèi)存占整個(gè)鎖內(nèi)存的百分比。
在兩種情況下會(huì)觸發(fā)鎖升級(jí):
·某個(gè)應(yīng)用程序請(qǐng)求的鎖所占用的內(nèi)存空間超出了maxlocks和locklist的乘積大小。這時(shí),數(shù)據(jù)庫(kù)管理器嘗試為該提出鎖請(qǐng)求的應(yīng)用程序申請(qǐng)表鎖,同時(shí)釋放行鎖來(lái)節(jié)省鎖內(nèi)存空間。
·數(shù)據(jù)庫(kù)中的所有鎖占用的內(nèi)存空間超過(guò)locklist大小。這時(shí),數(shù)據(jù)庫(kù)管理器也將嘗試為提出鎖請(qǐng)求的應(yīng)用申請(qǐng)表鎖,并釋放行鎖來(lái)節(jié)省內(nèi)存空間。
鎖升級(jí)有可能會(huì)失敗,例如:一個(gè)應(yīng)用正在對(duì)一個(gè)表加IX鎖,對(duì)表中的某些行加X鎖,另一個(gè)應(yīng)用又來(lái)請(qǐng)求表上的IS鎖以及表中大量行上的S鎖,由于申請(qǐng)的鎖數(shù)目過(guò)多而引起鎖升級(jí)。于是數(shù)據(jù)庫(kù)管理器嘗試著為該應(yīng)用申請(qǐng)表鎖S來(lái)減少應(yīng)用所需要的鎖的數(shù)目,但是表鎖S與表上已經(jīng)存在的IX鎖相沖突,于是鎖升級(jí)不能成功。于是鎖升級(jí)失敗的應(yīng)用接到一個(gè)-912的SQLCODE。在鎖升級(jí)失敗后,應(yīng)該考慮增加locklist或maxlocks,同時(shí)對(duì)于編程人員而言,可以在程序里對(duì)鎖升級(jí)失敗的應(yīng)用進(jìn)行回滾并重新提交(例如:if sqlca.sqlcode=-912 then rollback and retry)
聯(lián)系客服