專利名稱:利用索引樹對(duì)數(shù)據(jù)庫記錄進(jìn)行并發(fā)存取的方法
技術(shù)領(lǐng)域:
本發(fā)明屬于數(shù)據(jù)處理,具體涉及的是數(shù)據(jù)庫記錄的管理。
目前的數(shù)據(jù)處理系統(tǒng)包含有數(shù)據(jù)庫管理程序。借助于這些程序能夠方便地存取各個(gè)數(shù)據(jù)庫表格,每個(gè)表由多個(gè)記錄組成。關(guān)系數(shù)據(jù)庫程序能夠存取若干個(gè)不同的數(shù)據(jù)庫表,其中一個(gè)數(shù)據(jù)庫表的元素包含在另一數(shù)據(jù)庫表中。關(guān)系數(shù)據(jù)庫程序允許用戶利用幾個(gè)數(shù)據(jù)庫表所共有的某一個(gè)特定的字段或元素對(duì)這些不同的數(shù)據(jù)庫表中的數(shù)據(jù)進(jìn)行搜索、存取和更改。例如,一個(gè)數(shù)據(jù)庫表可能含有雇員名和雇員序號(hào),另一個(gè)數(shù)據(jù)庫表可能有雇員名和雇員薪水,第三個(gè)數(shù)據(jù)庫表可包含雇員名和雇員住地。關(guān)系數(shù)據(jù)庫程序可允許用戶存取雇員名、雇員序號(hào)、雇員薪水以及雇員住址并對(duì)這些表格作些改變,而不必一一存取每個(gè)數(shù)據(jù)庫表。
這些數(shù)據(jù)庫管理程序的一個(gè)重要方面是能夠?qū)蝹€(gè)數(shù)據(jù)庫中的諸記錄提供快速而有效的訪問能力。
最近的數(shù)據(jù)處理系統(tǒng)能夠支持多用戶,使每個(gè)用戶能夠同時(shí)并發(fā)地存取數(shù)據(jù)。
數(shù)據(jù)庫管理程序通常使用一種索引文件來迅速而有效地存取數(shù)據(jù)庫表中的記錄。這些索引文件通常是按B型樹結(jié)構(gòu)構(gòu)成的。談?wù)揃型樹的參考資料是“EfficientLockingForConcurrentOperationonB-Tree(B型樹上的并發(fā)操作的有效互鎖)”,這篇文章是由Lehman和Yao兩人于1981年12月發(fā)表在ACMTransactiononDatabaseSysten雜志第六卷第4期650頁至670頁上的。講述B型樹結(jié)構(gòu)的其它參考資料有“TheUbiquitousB-Tree”(到處可見的B型樹),由Comer發(fā)表在ComputingSurveys第11卷第二期,1979年6月,121-137頁;再一篇文章是“ConcurrentOperationonB-TreeWithOverTaking”(利用追補(bǔ)法對(duì)B型樹的并發(fā)操作),由Sagiv發(fā)表在ACM雜志關(guān)于數(shù)據(jù)庫系統(tǒng)原理的SIGACT-SIGMOD研討會(huì)的會(huì)議錄中,1985年3月,28-37頁。
作為B型樹結(jié)構(gòu)構(gòu)造出來的索引文件包含有一個(gè)根節(jié)點(diǎn)和許多由根節(jié)點(diǎn)分義出來的節(jié)點(diǎn)級(jí)。包含在這些節(jié)點(diǎn)中的信息是指向下一級(jí)節(jié)點(diǎn)或指向數(shù)據(jù)庫中記錄的指針,這些指針又進(jìn)一步包括可用于訪問數(shù)據(jù)庫中鍵記錄的被稱為鍵記錄信息的內(nèi)容,記錄的各個(gè)鍵按順序放置在所有節(jié)點(diǎn)上。例如,對(duì)于雇員名,可有一個(gè)按字為順序的索引樹。其中根節(jié)點(diǎn)包含引用鍵數(shù)據(jù),這些引用鍵可供下一級(jí)節(jié)點(diǎn)直接或間接地用來訪問有關(guān)的記錄。引用鍵含有索引字段,也就是雇員名字為拼寫的信息。因此,根節(jié)點(diǎn)中的有序的鍵將逐一指向下一級(jí)的名節(jié)點(diǎn)。換句話說,根節(jié)點(diǎn)下的第一個(gè)節(jié)點(diǎn)可以間接或直接地訪問以A、B、C開頭的所有雇員名,與這第一個(gè)節(jié)點(diǎn)并排的下一節(jié)點(diǎn)可包含雇員名是以D-M字為開頭的雇員記錄,這一級(jí)上的最后一個(gè)節(jié)點(diǎn)可包含雇員名是N-Z開始的記錄。當(dāng)搜索整個(gè)索引文件樹時(shí),最終總可以達(dá)到底部節(jié)點(diǎn),其內(nèi)容是指向存貯器中單個(gè)記錄的記錄鍵。
對(duì)數(shù)據(jù)庫表實(shí)施并發(fā)存取的問題之一出在多個(gè)事務(wù)處理企圖同時(shí)存取同一個(gè)記錄的時(shí)候。特別是當(dāng)一個(gè)用戶希望改變一個(gè)記錄而另一用戶又試圖使用這一記錄,那么就出現(xiàn)競(jìng)爭(zhēng)狀態(tài)。對(duì)此問題的一種解法辦法是對(duì)B型樹中各索引所對(duì)應(yīng)的記錄或其一部分實(shí)施互斥訪問或互鎖,以保證在一用戶正在訪問某記錄時(shí)不準(zhǔn)改變此索引節(jié)點(diǎn)或記錄。在IBM技術(shù)創(chuàng)新公告(IBMTechnicalDisclosureBulletin)第25卷第7B號(hào),1982年12月,3725-3729頁上有一篇題為“IndexLockingamdSplitting”(索引的互鎖與分離)以及在這同一雜志的第19卷第10期,1977年3月,3887-3889頁上有一篇題為“B型樹上的并發(fā)操作的互鎖協(xié)議”都講述了互鎖問題。
互鎖辦法的缺點(diǎn)是當(dāng)一個(gè)用戶訪問時(shí)用一把鎖禁止了其它用戶的訪問。
本發(fā)明的目標(biāo)是提供一種更為有效的通過索引樹存取數(shù)據(jù)庫中記錄的方法,同時(shí)還保障了對(duì)此數(shù)據(jù)庫記錄的更加有效的并發(fā)存取。
索引節(jié)點(diǎn)中的信息在被幾個(gè)用戶訪問過程中可能被修改。隨著有記錄被插入數(shù)據(jù)庫表中或從該表中刪去,索引節(jié)點(diǎn)中將含有被刪去或插入的鍵記錄信息。在記錄插入操作期間,因?yàn)橐粋€(gè)節(jié)點(diǎn)的存貯量有限,所以一個(gè)節(jié)點(diǎn)中的信息可能被移到另一節(jié)點(diǎn)。這種插入事務(wù)處理將試圖把一個(gè)節(jié)點(diǎn)中的鍵記錄信息移到另一節(jié)點(diǎn)來完成插入任務(wù)。在并發(fā)的事務(wù)處理訪問期間上述這種信息移動(dòng)會(huì)由于其索引信息被改變而造成并發(fā)事務(wù)處理訪問中的錯(cuò)誤條件,本發(fā)明的目標(biāo)是在改變索引信息期間使幾個(gè)事務(wù)處理能夠并發(fā)地訪問該索引而不產(chǎn)生錯(cuò)誤條件。
遵照本發(fā)明給出了在一組記錄鍵中根據(jù)通過一索引樹的一個(gè)鍵記錄或其一部分取出該鍵記錄數(shù)據(jù)的一種方法。該索引樹為不同的事務(wù)處理提供并發(fā)存取記錄鍵的能力,索引樹有一根節(jié)點(diǎn)和至少一級(jí)與根節(jié)點(diǎn)連接的子節(jié)點(diǎn),每個(gè)子節(jié)點(diǎn)有一鍵記錄引用(即指針-譯注),指向相鄰的下一級(jí)中的一個(gè)或多個(gè)節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)還有能直接存取鍵數(shù)據(jù)的底部節(jié)點(diǎn)。此方法包括七個(gè)步驟(1)利用所述的鍵記錄部分從根節(jié)點(diǎn)開始橫穿諸節(jié)點(diǎn)直到底部某個(gè)節(jié)點(diǎn);(2)對(duì)于其它的并發(fā)的事務(wù)處理,限制其對(duì)正在被穿越的節(jié)點(diǎn)和之前被訪問過的節(jié)點(diǎn)除了讀以外的所有訪問;(3)在所說的底部節(jié)點(diǎn)中標(biāo)識(shí)出所述的鍵記錄;(4)對(duì)于所說的鍵記錄限制對(duì)它們進(jìn)行讀以外的所有訪問;(5)撤消對(duì)穿越的各個(gè)節(jié)點(diǎn)的所有訪問限制;(6)取出鍵記錄數(shù)據(jù)(7)在這個(gè)記錄數(shù)據(jù)被取出后撤消對(duì)這個(gè)鍵記錄的訪問限制。
此外還提出了插入和刪除記錄鍵的方法以及在并發(fā)存取期間允許同時(shí)改變索引樹結(jié)構(gòu)的方法。
在附加的權(quán)利要求書中敘述了確信是屬于本發(fā)明之特征的新的特性。但是結(jié)合附圖參照下文的詳細(xì)說明,將會(huì)很好地理解本發(fā)明本身及權(quán)利要求中未曾提到的特性和優(yōu)點(diǎn)。本文的附圖有
圖1是數(shù)據(jù)庫表的說明;
圖2是數(shù)據(jù)庫表在計(jì)算機(jī)存貯器中的說明;
圖3是說明一個(gè)簡(jiǎn)單的B型樹索引的框圖;
圖4是帶索引的B型樹節(jié)點(diǎn)數(shù)據(jù)在計(jì)算機(jī)存貯器中的存貯說明;
圖5是說明通過帶索引的B型樹的初始搜索操作的流程圖;
圖6是說明通過帶索引的B型樹的取數(shù)操作的流程圖;
圖7是通過帶索引的B型樹進(jìn)行插入操作的流程圖;
圖8是通過帶索引的B型樹執(zhí)行刪除操作的流程圖;
圖9是說明分離一個(gè)節(jié)點(diǎn)的算法的流程圖;
圖10是拆除一個(gè)節(jié)點(diǎn)的算法的流程圖。
本發(fā)明涉及的是數(shù)據(jù)庫程序?qū)τ涗浀拇嫒栴}。下面的例子大刀闊斧地簡(jiǎn)化了數(shù)據(jù)庫的存取問題,其目的是為了使讀者更容易理解包含在例子中的本發(fā)明。讀者應(yīng)當(dāng)明白,包含在數(shù)據(jù)庫表中的信息項(xiàng)目和內(nèi)容實(shí)際上比所說明的要復(fù)雜得多。
圖1所說明的表(10)包括雇員姓名和編號(hào)。每個(gè)雇員記錄包含一個(gè)單一的雇員號(hào)。表(10)中的姓名按字母順序排列。但是內(nèi)行人懂得,在計(jì)算機(jī)內(nèi)存中,諸記錄的存貯方式并不是這樣的。
圖2說明雇員的姓名/編號(hào)記錄在計(jì)算機(jī)存貯器(12)中的存貯情況。每個(gè)記錄(14,16,18,20,24和26)均有若干部分組成。在記錄14中,先后包括地址部分(28)、雇員名(30)和雇員號(hào)(32)。地址部分(28)是該雇員名和雇員號(hào)(30,32)在計(jì)算機(jī)內(nèi)存中的實(shí)際位置。圖2所示的表12說明姓名的存貯并不是按字母順序的,甚至不是相鄰的。
數(shù)據(jù)庫程序通常為用戶提供一種能使他快速地存取存貯器中指定記錄的索引樹。這種索引樹的例子如圖3所示。為了簡(jiǎn)化表示,該索引樹只給出兩級(jí)。索引40包含有一個(gè)根節(jié)點(diǎn)和與它連接的三個(gè)節(jié)點(diǎn)50,52和54。根節(jié)點(diǎn)42稱為“索引標(biāo)識(shí)”,它詳細(xì)說明了該索引中的信息類型。在這個(gè)例子中,其索引是由雇員姓名按字母遞升順序構(gòu)成的索引。每個(gè)雇員姓名包括一個(gè)鍵。本例中的鍵是雇員姓名的第一個(gè)字母,這些鍵被用于標(biāo)識(shí)下一級(jí)的節(jié)點(diǎn),以便在搜索一個(gè)特定的雇員姓名記錄時(shí)使用。在根結(jié)點(diǎn)42中,各個(gè)鍵由字母“D”(44),“F”(46)和“空”48組成。D這個(gè)鍵(44)指引用戶從根結(jié)點(diǎn)42(父節(jié)點(diǎn))到節(jié)點(diǎn)50(子節(jié)點(diǎn))。節(jié)點(diǎn)50含有可供直接存取雇員Andrews、Baker和Chester的鍵記錄信息。但是在根節(jié)點(diǎn)中只用了一個(gè)鍵。這個(gè)鍵涉及到最高層的信息(或最高鍵的記錄),這個(gè)最高層的信息目前在節(jié)點(diǎn)50中或許不存在或者已經(jīng)存在。類似地,字母“F”(46)指導(dǎo)用戶轉(zhuǎn)到節(jié)點(diǎn)52,在這個(gè)節(jié)點(diǎn)中包含有雇員名Edgar和Edward。最后“空”(48)這個(gè)鍵使用戶轉(zhuǎn)到節(jié)點(diǎn)54?!翱铡边@個(gè)鍵表示節(jié)點(diǎn)54是最后一個(gè)相鄰的葉子節(jié)點(diǎn)。內(nèi)行的人應(yīng)當(dāng)理解,索引40也可以包含多級(jí)節(jié)點(diǎn)。但為簡(jiǎn)單起見,在此只給出兩級(jí)索引40。
圖4中56、58和60三列分別表示節(jié)點(diǎn)50、52和54的內(nèi)容在計(jì)算機(jī)內(nèi)存中可能出現(xiàn)的形式。列56表示包含在節(jié)點(diǎn)50中的信息在計(jì)算機(jī)內(nèi)存中如何存貯,列56包括一組指針62和數(shù)據(jù)存貯區(qū)64,指針66指向含有雇員姓名Andrew和雇員號(hào)的信息。類似地,指針68指向雇員名Baker及有關(guān)信息。因此,當(dāng)一個(gè)事務(wù)處理存取一個(gè)節(jié)點(diǎn)時(shí),它首先考察這個(gè)節(jié)點(diǎn)信息的指針部分以確定這一鍵記錄信息存在何處。這一指針的信息可用來直接存取包含所需信息的存貯單元。在包含有中間級(jí)的多級(jí)索引結(jié)構(gòu)中,這一節(jié)點(diǎn)存貯單元將包含指向按鍵記錄信息排列的下一個(gè)相鄰位置的節(jié)點(diǎn)的地址的指針。這些指針將按照它們有關(guān)的鍵信息排序。但是一個(gè)連續(xù)的節(jié)點(diǎn),例如節(jié)點(diǎn)50,可包含有幾個(gè)雇員名,所以只能用父節(jié)點(diǎn)中的單個(gè)鍵來引用它。所引用的鍵將是該節(jié)點(diǎn)中所允許的最高鍵的記錄信息。在含有中間節(jié)點(diǎn)的索引樹中,前頭(或父)節(jié)點(diǎn)中的鍵將是本節(jié)點(diǎn)中最高記錄的鍵,這個(gè)鍵被本節(jié)點(diǎn)中所有的鍵所引用。
圖5說明通過索引來存取記錄信息的流程圖。應(yīng)當(dāng)理解,在數(shù)據(jù)庫管理程序中,由圖5到8所示的軟件程序是在訪問事務(wù)處理期間被調(diào)用的。根據(jù)所舉的例子,該事務(wù)處理試圖取出一個(gè)記錄來確定其雇員編號(hào),或者試圖執(zhí)行一些其它操作,諸如記錄的插入和刪除操作。
圖4和3還畫出了從一個(gè)樹葉節(jié)點(diǎn)指向下一個(gè)相鄰樹葉節(jié)點(diǎn)的指針51和53。72和74這些指針將指導(dǎo)訪問型的事務(wù)處理去存取下一個(gè)相鄰位置的樹葉節(jié)點(diǎn)。在這個(gè)例子中,點(diǎn)60中Null這一項(xiàng)76表示節(jié)點(diǎn)60是最后一個(gè)節(jié)點(diǎn)。
在圖5中,訪問程序從步驟100開始并繼續(xù)到步驟102,在這里,索引的根節(jié)點(diǎn)被S型鎖鎖住并開始存取。這個(gè)索引標(biāo)識(shí)符節(jié)點(diǎn)標(biāo)明,該索引的類型并為訪問本例中的一個(gè)記錄提供初始方向。索引標(biāo)識(shí)節(jié)點(diǎn)將按雇員姓名的字母遞升順序來標(biāo)識(shí)該索引。在103步,按照父節(jié)點(diǎn)中的信息標(biāo)識(shí)出要被存取的這個(gè)子節(jié)點(diǎn)。在104步,確定要被執(zhí)行的那個(gè)操作是否是取數(shù)操作。如果不是取數(shù)操作,換句話說,如果是插入記錄(或者是插入一個(gè)鍵記錄)或刪除記錄(或刪除鍵記錄)操作,該程序便前進(jìn)到106步,以確定父節(jié)點(diǎn)底下的節(jié)點(diǎn)是不是葉子節(jié)點(diǎn)或底部節(jié)點(diǎn)。如是,該程序進(jìn)到110步,并且在這個(gè)子節(jié)點(diǎn)上獲得一個(gè)X型鎖。X型鎖是排他鎖,它阻止對(duì)此結(jié)點(diǎn)作任何其它訪問。換言之,使用了X鎖的那個(gè)事務(wù)處理阻止所有其它事務(wù)處理來訪問這個(gè)節(jié)點(diǎn)。
現(xiàn)在回到104步,如果本操作是一個(gè)取數(shù)操作或者在106步得知這個(gè)子節(jié)點(diǎn)不是葉子節(jié)點(diǎn),那么該程序前進(jìn)到108步,在這個(gè)子節(jié)點(diǎn)上獲得一把S型鎖。S型鎖允許其它并發(fā)性的用戶作些有限制的訪問。所謂有限制的訪問指的是只允許其它用戶讀這個(gè)節(jié)點(diǎn),而不準(zhǔn)許作諸如刪除或修改等等其它操作?,F(xiàn)在程序前進(jìn)到112步,在這一步,該程序開始存取這個(gè)子節(jié)點(diǎn)并確定正在被存取的那個(gè)記錄的鍵是否高于這個(gè)子節(jié)點(diǎn)中的鍵,如是,該程序就進(jìn)到114步來判別這一樹形的索引結(jié)構(gòu)是否被鎖住。如果未被鎖住,該程序就進(jìn)到118步,其中的操作是父節(jié)點(diǎn)和這個(gè)子節(jié)點(diǎn)上的鎖均被解開而整棵樹被鎖住,接著該程序從118步返回到102步,以便在允許對(duì)這棵樹上鎖的情況下重新開始該操作。在重新試作上述操作時(shí)可以作些優(yōu)化,以便減少要被存取的節(jié)點(diǎn)數(shù)。
在本例中,對(duì)整棵樹的X型鎖用來告訴所有別的訪問操作樹形結(jié)構(gòu)正在改變。如果在試圖對(duì)這個(gè)樹上鎖時(shí),正在做一棵樹的上X型鎖的存取,敲湊庵制笸急匭氳鵲較瓤嫉哪歉齜夢(mèng)式崾笤俳小 對(duì)一棵樹的S型鎖告訴其它所有訪問者本樹不在作結(jié)構(gòu)改變,允許其它訪問者并發(fā)地使用這個(gè)索引樹。但是在這個(gè)S型鎖松開之前不能作別的改變操作。不論是否有S型或X型鎖橫切一棵樹的操作總可發(fā)生,橫切樹的操作可包括鍵記錄的刪除和插入。
在114步,如果這個(gè)樹上著鎖,或者在112步當(dāng)這個(gè)鍵不大于該子節(jié)點(diǎn)中的最高鍵,那么該程序進(jìn)到116步來確定該子節(jié)點(diǎn)是否是葉子,若不是,下一步就是115步來松開父節(jié)點(diǎn)上的鎖之后回到103步。但是,這個(gè)子節(jié)點(diǎn)如果是葉子,程序就進(jìn)到120步,以便松開父節(jié)點(diǎn)的鎖,然后再到122、124和126步以便確定該操作是取、插入還是刪除操作。在這個(gè)例子中,如果上述三種操作哪個(gè)都不是,那么本程序就在130步返回到用戶。實(shí)際上這種返回將包括一個(gè)出錯(cuò)指示,它表明這個(gè)訪問處理程序不能識(shí)別所要執(zhí)行的操作。
如果要執(zhí)行的操作是取數(shù)操作,那么該程序進(jìn)入到如圖6所示的200步。在這一步中,該程序找出正在被搜索的所需要的鍵或者起碼是相鄰的那個(gè)最高鍵。在202那一步,該程序接著請(qǐng)求對(duì)此鍵記錄有條件地上鎖,在本例中,有條件的上鎖是請(qǐng)求對(duì)各記錄鍵實(shí)施上鎖管理的程序來執(zhí)行的。所謂“有條件”指的是如果這個(gè)鎖不能立即被答應(yīng),那么將對(duì)提出請(qǐng)求的訪問者給出一個(gè)回答以指出這樣的一種鎖不能被答應(yīng)。在204步中使用這一回答。如果這個(gè)鎖至今還不被答應(yīng),該程序就轉(zhuǎn)到206步來松開這個(gè)子節(jié)點(diǎn)的鎖,然后再轉(zhuǎn)到208步,對(duì)此鍵記錄請(qǐng)求無條件上鎖。在208這一步,訪問者一直等到這樣一種鎖被許可后才往下進(jìn)行。一旦上鎖條件滿足后,該程序通過轉(zhuǎn)接符213轉(zhuǎn)到圖5中所示的102步,以便重新開始搜索。讓我們回到204步,如果已經(jīng)允許上鎖,該程序便進(jìn)到209步以便送回這個(gè)鍵記錄的數(shù)據(jù)。在210步,子節(jié)點(diǎn)的鎖被松開。在211步松開鍵記錄的鎖。內(nèi)行的人將十分清楚,211這一步將在這個(gè)事務(wù)處理完成時(shí)或者在略早一些時(shí)候發(fā)生。
圖7用來說明插入操作。內(nèi)行人知道,必要時(shí),在插入操作開始前,對(duì)要被插入的鍵記錄需要上X型鎖。這一操作將把一個(gè)記錄插入到計(jì)算機(jī)內(nèi)存中并在索引中增加一個(gè)插入鍵,以便更新該索引中的有關(guān)節(jié)點(diǎn),從而使其它事務(wù)處理能夠使用新插入的記錄。在300這一步它首先判斷這個(gè)鍵能否和底部或葉子節(jié)點(diǎn)相配。如是,該程序轉(zhuǎn)到304步去找高于要被插入的那個(gè)鍵的下一相鄰的鍵。如果下一個(gè)鍵不在本節(jié)點(diǎn)中,再去訪問下一個(gè)相鄰位置的葉子節(jié)點(diǎn)。如果不存在下一相鄰位置的葉子節(jié)點(diǎn)。本次訪問將會(huì)得到一個(gè)空指示符,從而在308步,該程序針對(duì)下一鍵記錄請(qǐng)求一個(gè)有條件的X型鎖。接著在312步確定這個(gè)鎖是否允許。如被允許,在318步把這個(gè)新的鍵插入到第一個(gè)底部節(jié)點(diǎn),這就是在300步到達(dá)的節(jié)點(diǎn)。在324步,下一個(gè)記錄和鍵記錄的鎖被松開。此外,在329步把所有鎖著的鎖都松開,接著在325步上程序返回。內(nèi)行人顯然會(huì)明白,在事務(wù)處理結(jié)束后,對(duì)于被插入的那個(gè)鍵記錄的鎖將被放開?,F(xiàn)在回到312步,如果那把鎖不答應(yīng),該程序就進(jìn)行到316步去松開那個(gè)子節(jié)點(diǎn)上的鎖,然后再轉(zhuǎn)到322步請(qǐng)求對(duì)這下一個(gè)鍵記錄上無條件的X型鎖。然后該程序通過轉(zhuǎn)接符328回到102步(圖5)。
讓我們回到300步,如果這個(gè)鍵與該葉子節(jié)點(diǎn)不相配,該程序就轉(zhuǎn)到302步去請(qǐng)求對(duì)整棵樹上有條件的X型鎖。在306步確定這個(gè)有條件的鎖是否被許可。若不,該程序進(jìn)入310步去松開這個(gè)子節(jié)點(diǎn)的鎖,然后到314步,請(qǐng)求一個(gè)對(duì)于整個(gè)樹的無條件的X型鎖。在允許對(duì)整棵樹上無條件的X型鎖之后或者在306步允許上鎖,該程序就繼續(xù)到320步執(zhí)行節(jié)點(diǎn)分裂算法。此算法給出一個(gè)新節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)含有從前面的節(jié)點(diǎn)分離出來的部分信息。節(jié)點(diǎn)分裂算法還可能給出外加的中間節(jié)點(diǎn),這個(gè)外加的節(jié)點(diǎn)將可能被更新。父節(jié)點(diǎn)也被修改,使它包含最高鍵記錄和指向新節(jié)點(diǎn)的指針。圖9中說明了一種節(jié)點(diǎn)分裂算法。而且在Addison-Wesley出版公司于1983年出版的名為“數(shù)據(jù)結(jié)構(gòu)和算法”這本書的170-179頁中講述了節(jié)點(diǎn)分裂算法,該書的作者是Aho、Hopcroft和Ullman。節(jié)點(diǎn)分裂算法完成后,該程序轉(zhuǎn)到326步去解開整棵樹的鎖。然后該程序經(jīng)過轉(zhuǎn)接符327回到102步(圖5)。
圖8舉例說明了刪除操作。內(nèi)行人很清楚,要被刪除的那個(gè)鍵記錄將被掛上X型鎖,這當(dāng)然是在必要時(shí)在作刪除操作之前做的。在400步,該程序?qū)ふ蚁乱粋€(gè)相鄰的高于要被刪除的鍵的鍵。在402步,該程序請(qǐng)求對(duì)這下一個(gè)鍵記錄掛有條件的X型鎖,然后轉(zhuǎn)404步確定這個(gè)鎖是否被允許。若不允許,這個(gè)程序就轉(zhuǎn)到406步去解下相應(yīng)子節(jié)點(diǎn)的鎖,接著在410步請(qǐng)求對(duì)這下一鍵記錄掛無條件的鎖。然后該程序經(jīng)由轉(zhuǎn)接符431回到102步(圖5)。
讓我們回到404步,如果這把鎖被許可,那么在408步,這個(gè)鍵就被刪除。然后程序轉(zhuǎn)到412步去確定這下一個(gè)節(jié)點(diǎn)是否是空。若不空,該程序在421步解下這個(gè)節(jié)點(diǎn)的鎖,在413步解開這下一鍵記錄的鎖之后在414步返回。但是,如若該節(jié)點(diǎn)為空,該程序就進(jìn)入416步請(qǐng)求對(duì)樹作有條件的X型鎖操作。然后在418步確定這個(gè)鎖是否被允許,若不,則在420步去解開這個(gè)子節(jié)點(diǎn)的鎖。然后在400步請(qǐng)求對(duì)樹上無條件的X型鎖,一旦這個(gè)鎖被允許,來自422或418的程序前進(jìn)到424步去執(zhí)行節(jié)點(diǎn)拆除算法,這個(gè)算法將從索引樹中移去這個(gè)空節(jié)點(diǎn)和從上一節(jié)點(diǎn)指向這個(gè)空節(jié)點(diǎn)的引用。圖10是這一拆除算法的圖解說明。在426步,這棵樹的鎖被解開。在429步,被刪除的鍵記錄和下一鍵記錄的鎖被解開。內(nèi)行的人應(yīng)當(dāng)會(huì)明白,429步在該事務(wù)處理結(jié)束時(shí)發(fā)生。
圖9舉例說明了一種節(jié)點(diǎn)分裂算法。在這個(gè)算法中,加到索引樹中的新節(jié)點(diǎn)用來存貯新插入的鍵記錄。而且索引樹中的所有在新節(jié)點(diǎn)之前的節(jié)點(diǎn)或父節(jié)點(diǎn)均可能被修改以反映出這個(gè)新加的節(jié)點(diǎn)和其中包含的信息。在500步,得到一個(gè)新節(jié)點(diǎn)。在502對(duì)這個(gè)新節(jié)點(diǎn)掛上X型鎖。在504步,把被分裂的那個(gè)節(jié)點(diǎn)中的一部分鍵移到新結(jié)點(diǎn)。顯然,在被分裂的節(jié)點(diǎn)中應(yīng)當(dāng)有一個(gè)指針指向這個(gè)新節(jié)點(diǎn)。此外,如果需要,在新節(jié)點(diǎn)中也應(yīng)該有一個(gè)指針指明對(duì)這個(gè)新節(jié)點(diǎn)而言的下一個(gè)相鄰位置上的節(jié)點(diǎn)。在506步,被分裂的節(jié)點(diǎn)和新節(jié)點(diǎn)都被解鎖。在507步,相對(duì)于被分裂節(jié)點(diǎn)的父節(jié)點(diǎn)被掛上X型鎖。在508步,這個(gè)父節(jié)點(diǎn)被更新。在10步,解開這個(gè)父節(jié)點(diǎn)的鎖。內(nèi)行人應(yīng)當(dāng)明白,父節(jié)點(diǎn)的更新實(shí)際上可能涉及這個(gè)父節(jié)點(diǎn)的分裂和這棵索引樹上的若干個(gè)相繼位置上的父節(jié)點(diǎn)的更新。
圖10舉例說明了一種節(jié)點(diǎn)拆除算法。這個(gè)節(jié)點(diǎn)拆除算法的用途是從索引樹中移去一個(gè)空節(jié)點(diǎn),以便貯備存貯空間并提高對(duì)鍵的存取效率。在600步,使鄰接這個(gè)空節(jié)點(diǎn)一個(gè)節(jié)點(diǎn)掛上X型鎖。在602步,這個(gè)鄰接節(jié)點(diǎn)的鍵被移到空節(jié)點(diǎn)。在604步,更新接受節(jié)點(diǎn)(即原來的空節(jié)點(diǎn)-譯注)中的指針和其中的鍵,以便用新加載的鍵對(duì)這些結(jié)點(diǎn)定位。在606步,它的下一個(gè)節(jié)點(diǎn),即當(dāng)前的空節(jié)點(diǎn)被拆除。在608節(jié),解除這個(gè)子節(jié)點(diǎn)上的各個(gè)鎖,解除剛被移走鍵的那個(gè)節(jié)點(diǎn)的鎖以及那個(gè)相鄰節(jié)點(diǎn)(目前已經(jīng)被拆除)上的鎖。然后在610步對(duì)各個(gè)父節(jié)點(diǎn)掛上X型鎖。在612步,修改各個(gè)父節(jié)點(diǎn),目的是拆除指向被拆除節(jié)點(diǎn)的指針和調(diào)整與從被拆除的節(jié)點(diǎn)中得到鍵的那個(gè)節(jié)點(diǎn)相關(guān)的鍵。在614步,解除各個(gè)父節(jié)點(diǎn)上的鎖。正如在圖9中所講過的一樣,各個(gè)父節(jié)點(diǎn)的更新可能會(huì)引起一種遞歸處理,這對(duì)內(nèi)行的人來說是不難理解的。
本發(fā)明是用于這樣一個(gè)系統(tǒng)的該系統(tǒng)為若干個(gè)數(shù)據(jù)庫事務(wù)處理提供并發(fā)地存取其索引樹的能力。本發(fā)明的目標(biāo)是在下述意義下提供并發(fā)存取的能力,即如果認(rèn)為有必要,在單個(gè)事務(wù)處理中執(zhí)行重復(fù)的存取將會(huì)得到一致的結(jié)果。換句話說,前面解釋過的存取過程使得一個(gè)事務(wù)處理在另一個(gè)事務(wù)處理正在改變索引樹期間去訪問這個(gè)索引樹時(shí)不會(huì)送回錯(cuò)誤的或無效的信息,但在改變索引樹期間去存取索引樹的一部分則可能導(dǎo)致錯(cuò)誤,因?yàn)樗饕龢淇梢陨湘i,所以上述結(jié)果是可能的。使用索引樹鎖的目的是使得索引樹改變期間能夠并發(fā)地存取這棵樹。但是,事務(wù)處理協(xié)議要求當(dāng)存在一個(gè)可能導(dǎo)致錯(cuò)誤的條件時(shí),碰到這種條件的事務(wù)處理請(qǐng)求對(duì)這棵樹上鎖以阻止送回錯(cuò)誤條件或錯(cuò)誤的數(shù)據(jù)。當(dāng)一個(gè)事務(wù)處理請(qǐng)求對(duì)索引樹上鎖時(shí),如果有另一個(gè)事務(wù)請(qǐng)求正在修改這棵索引樹結(jié)構(gòu),那么發(fā)出上鎖請(qǐng)求的事務(wù)處理必須等待,因?yàn)樵缦饶莻€(gè)事務(wù)處理已經(jīng)用了這棵樹的鎖。等到允許使用這個(gè)樹的鎖時(shí),發(fā)出請(qǐng)求的事務(wù)處理將得到保證在它訪問期間將不會(huì)再有別的事務(wù)處理對(duì)這個(gè)索引樹結(jié)構(gòu)作任何改變。這種處理方法要比對(duì)索引樹執(zhí)行互斥訪問好,因?yàn)樗试S并發(fā)存取并提供一種機(jī)構(gòu)來保證事務(wù)處理不在索引樹結(jié)構(gòu)改變期間取回正在改變的信息。
本發(fā)明防止第一個(gè)事務(wù)處理在并發(fā)的第二個(gè)事務(wù)處理完成它的插入和刪除操作之前看到其操作結(jié)果。
雖然上面對(duì)于本發(fā)明的描述是相對(duì)于說明性的實(shí)施例的,但是這個(gè)描述并不局限于此。熟悉本行的人看了上述說明之后將會(huì)明白對(duì)本實(shí)施例的各種改變以及其它一些實(shí)施例。因此,可以予料,附加的權(quán)利要求將包括屬于本發(fā)明范圍的上述這種修改和實(shí)施例。
權(quán)利要求
1.在一個(gè)系統(tǒng)中執(zhí)行一個(gè)事務(wù)處理時(shí)利用通過索引樹的一個(gè)鍵記錄的一部分從一組記錄鍵中取出鍵記錄數(shù)據(jù)的一種方法,在這個(gè)系統(tǒng)中,另一些事務(wù)處理可以通過所說的索引樹并發(fā)地存取所說的記錄鍵,所說的索引樹至少有一個(gè)根節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)有一鍵記錄指針指向下一較低的有序的層次中的一個(gè)或多個(gè)節(jié)點(diǎn),所說的索引樹還有一些底部節(jié)點(diǎn),用它們可以訪問所說的鍵記錄數(shù)據(jù),其特征在于下述步驟(a)利用所述的鍵記錄部分從所說的根節(jié)點(diǎn)出發(fā)穿越所述的各個(gè)節(jié)點(diǎn)直到抵達(dá)底部的一個(gè)節(jié)點(diǎn);(b)限制其它并發(fā)的事務(wù)處理對(duì)正在被穿過的節(jié)點(diǎn)和前已訪問過的節(jié)點(diǎn)作讀操作以外的訪問;(c)在所述的底部節(jié)點(diǎn)中標(biāo)識(shí)出所述的鍵記錄;(d)對(duì)所述的鍵記錄限制對(duì)它作讀操作以外的訪問;(e)對(duì)被穿越的節(jié)點(diǎn)撤消對(duì)它的所有訪問限制;(f)取出鍵記錄數(shù)據(jù);和(g)在記錄數(shù)據(jù)被取出后,撤消對(duì)此鍵記錄的訪問限制。
2.如權(quán)利要求1所述的方法,其特征在于步驟(c)進(jìn)一步包括下列步驟(c1)標(biāo)識(shí)出所述的節(jié)點(diǎn)中所述記錄的各個(gè)鍵;(c2)根據(jù)該節(jié)點(diǎn)中所述記錄的各鍵確定是否要穿越另一個(gè)節(jié)點(diǎn);(C3)如果要穿越另一節(jié)點(diǎn),則回到(a)步;(C4)如果不要穿越另一節(jié)點(diǎn),則按照這個(gè)鍵記錄的那一部分來標(biāo)識(shí)出這一鍵記錄數(shù)據(jù)。
3.如權(quán)利要求2所述的方法,其特征在于所表述的步驟(f)包括下列分步(f1)從所述的節(jié)點(diǎn)中取出所說的鍵記錄;(f2)根據(jù)所述節(jié)點(diǎn)中的那個(gè)鍵記錄存取一個(gè)記錄;和(f)從所述的記錄中得到記錄數(shù)據(jù)。
4.如權(quán)利要求3所述的方法,其特征在于所表述的步驟(g)進(jìn)一步包括要等到取鍵記錄數(shù)據(jù)的事務(wù)處理完成之后才能撤消對(duì)此鍵記錄的訪問限制。
5.在一個(gè)系統(tǒng)中執(zhí)行一個(gè)事務(wù)處理期間按照通過索引樹的一個(gè)鍵記錄的格式插入一個(gè)由一組記錄鍵組成的鍵記錄的一種方法,在插入過程中有其它的事務(wù)處理通過所述的索引樹并發(fā)地存取所述的記錄鍵,所述的索引樹至少有一個(gè)根節(jié)點(diǎn),每一節(jié)點(diǎn)有一鍵記錄指針指向下一相鄰層次中的一個(gè)或多個(gè)節(jié)點(diǎn),還有一些底部節(jié)點(diǎn),它們被用來存取所述記錄的各個(gè)鍵,其特征在于下列步驟(a)根據(jù)所述的鍵從所說的根節(jié)點(diǎn)出發(fā)穿過所有節(jié)點(diǎn)直到一個(gè)底部節(jié)點(diǎn)為止;(b)在穿越上述節(jié)點(diǎn)時(shí)對(duì)其它并發(fā)的事務(wù)處理而言禁止它們對(duì)正在被穿過的節(jié)點(diǎn)和不超過一個(gè)的前面節(jié)點(diǎn)作讀以外的所有訪問;(c)標(biāo)識(shí)出與要被插入到所述的底部節(jié)點(diǎn)的那個(gè)鍵記錄有關(guān)的下一相鄰位置的鍵記錄并禁止對(duì)此底部節(jié)點(diǎn)的所有訪問;(d)限制對(duì)所述的下一個(gè)相鄰位置的鍵記錄的所有訪問,(e)插入所述的鍵記錄;(f)撤消對(duì)下一個(gè)相繼位置的記錄鍵的訪問限制;以及(g)撤消對(duì)于被穿越節(jié)點(diǎn)的所有訪問限制。
6.如權(quán)利要求5所述的方法,其特征在于所表達(dá)的步驟(e)包括下列分步(e1)判斷在所述的節(jié)點(diǎn)中能否插入此鍵記錄;(e2)如果能把這個(gè)鍵插入該節(jié)點(diǎn),轉(zhuǎn)到(e6)步;(e3)如果這個(gè)鍵不能被插入到該節(jié)點(diǎn)中,則給出一種指示,表明該索引樹結(jié)構(gòu)正在改變;(e4)更改這個(gè)索引樹結(jié)構(gòu),增加一個(gè)節(jié)點(diǎn)來接收這個(gè)鍵記錄;(e5)去掉索引樹結(jié)構(gòu)改變的指示;以及(e6)把所述的鍵記錄插入該節(jié)點(diǎn)。
7.在一個(gè)系統(tǒng)中作一個(gè)事務(wù)處理期間按照通過索引樹的一個(gè)鍵記錄刪除一個(gè)由一組記錄鍵組成的鍵記錄的方法,在刪除操作期間,可能有其它的事務(wù)處理通過所述的索引樹并發(fā)地存取所說的記錄鍵,所說的索引樹有一根結(jié)點(diǎn),根節(jié)點(diǎn)之下至少還有一層節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)都有一鍵記錄指針指向下一相鄰層次上的一個(gè)或多個(gè)節(jié)點(diǎn),還有一些底部節(jié)點(diǎn),它們被用來存取所述的記錄鍵,其特征在于下列步驟(a)根據(jù)所給的鍵,從所述的根節(jié)點(diǎn)開始穿過所說的各個(gè)節(jié)點(diǎn)直到底部節(jié)點(diǎn)為止;(b)在穿越諸節(jié)點(diǎn)時(shí)阻止其它并發(fā)的事務(wù)處理對(duì)正在被穿越的節(jié)點(diǎn)和不超過一個(gè)的前頭節(jié)點(diǎn)作讀以外的訪問;(c)標(biāo)識(shí)出在底部節(jié)點(diǎn)中與要被刪除的鍵記錄相關(guān)的下一相鄰位置的鍵記錄并禁止對(duì)此底部節(jié)點(diǎn)作任何存取;(d)禁止對(duì)所說的下一相鄰位置上的鍵記錄的任何訪問;(e)刪除所述的鍵記錄;(f)撤消對(duì)被穿越節(jié)點(diǎn)的所有訪問限制;及(g)解除對(duì)下一相鄰位置上鍵記錄的訪問限制。
8.如權(quán)利要求7所述的方法,其特征在于所說的步驟(e)包括下列子步(e1)判斷要被刪去的鍵記錄是不是所述節(jié)點(diǎn)中的唯一鍵記錄;(e2)如果要被刪除的鍵不是該節(jié)點(diǎn)中的唯一的鍵,那么刪除該節(jié)點(diǎn)中所說的鍵記錄,然后轉(zhuǎn)到(f)步;(e3)如果要被刪除的鍵是該節(jié)點(diǎn)中唯一的鍵,那么給出一種指示,指明該索引樹結(jié)構(gòu)正在被改變;(e4)刪除該節(jié)點(diǎn)中的所述的鍵記錄;(e5)修改索引樹結(jié)構(gòu),拆除此節(jié)點(diǎn);及(e6)抹去索引樹在改變的指示。
9.如權(quán)利要求8所述的方法,其特征在于講到的步驟(g)進(jìn)一步涉及要等到請(qǐng)求刪除該鍵記錄的事務(wù)處理結(jié)束后才能撤消對(duì)此鍵記錄的訪問限制
10.關(guān)于修改索引樹結(jié)構(gòu)的一種方法,該方法在一個(gè)系統(tǒng)中的一次事務(wù)處理期間根據(jù)一個(gè)鍵記錄來存取至少一個(gè)由一組記錄鍵組成的鍵記錄,在這個(gè)系統(tǒng)中還有別的事務(wù)處理通過所述的索引樹并發(fā)地訪問所述的記錄鍵,所說的索引樹結(jié)構(gòu)至少有一個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)有一鍵記錄指針,指向任何一個(gè)別的節(jié)點(diǎn)或者指向可以被直接存取的所述的鍵記錄,其特征在于下列步驟(a)判斷索引樹是否正在被改變的指示;(b)給出一個(gè)索引樹在改變的指示,以便允許對(duì)此索引樹進(jìn)行并發(fā)存取;(c)更改所述的索引樹節(jié)點(diǎn),以及(d)撤消索引樹在改變的指示。
全文摘要
一種利用索引樹進(jìn)行并發(fā)存取的方法包括步驟(1)利用所說的鍵記錄從所說的根節(jié)點(diǎn)開始穿越所述各個(gè)節(jié)點(diǎn)直到一個(gè)底部節(jié)點(diǎn);(2)禁止別的并發(fā)的事務(wù)處理對(duì)正在被穿越的節(jié)點(diǎn)和在它之前被訪問過的節(jié)點(diǎn)的讀之外的訪問;(3)指出在底部節(jié)點(diǎn)中的所說的鍵記錄;(4)限制對(duì)所述的鍵記錄只能作讀操作;(5)解除對(duì)被穿過的諸節(jié)點(diǎn)的所有訪問限制;(6)取出這個(gè)鍵記錄數(shù)據(jù);以及(7)在取出記錄數(shù)據(jù)后撤消對(duì)此鍵記錄的訪問限制。
文檔編號(hào)G06F17/30GK1035193SQ88107439
公開日1989年8月30日 申請(qǐng)日期1988年10月29日 優(yōu)先權(quán)日1987年10月30日
發(fā)明者弗蘭克·埃利奧特·萊溫尼, 卡德萊斯卡納·莫漢 申請(qǐng)人:國(guó)際商用機(jī)器公司