專利名稱:并行修改事務(wù)處理系統(tǒng)索引樹的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)處理方法和裝置,在其所述實(shí)施例中更具體地涉及用于記錄的數(shù)據(jù)庫管理的方法和裝置。
在現(xiàn)有技術(shù)中已經(jīng)公知了多種數(shù)據(jù)庫管理或事務(wù)處理系統(tǒng)。通常采用這些系統(tǒng),以便實(shí)現(xiàn)對包含多個(gè)數(shù)據(jù)記錄的數(shù)據(jù)庫表進(jìn)行快速訪問。關(guān)系事務(wù)處理系統(tǒng)能對多個(gè)數(shù)據(jù)庫表進(jìn)行訪問,在這些數(shù)據(jù)庫表中,一個(gè)數(shù)據(jù)庫表中的單元通常與另一個(gè)數(shù)據(jù)庫表中的單元相關(guān)。關(guān)系數(shù)據(jù)庫允許一個(gè)用戶通過使用一個(gè)或多個(gè)特定的單元或字段,檢索、存取和變更包含在多個(gè)數(shù)據(jù)庫表中的數(shù)據(jù)。
所有這種數(shù)據(jù)庫系統(tǒng)的一個(gè)重要方面就是系統(tǒng)具有對每個(gè)數(shù)據(jù)庫中的各個(gè)記錄實(shí)現(xiàn)快速有效訪問的能力。近來已經(jīng)有多種數(shù)據(jù)庫管理系統(tǒng),這些系統(tǒng)支援多個(gè)用戶同時(shí)使用數(shù)據(jù)庫,允許這些用戶并行訪問特定的數(shù)據(jù)。
通常由數(shù)據(jù)管理程序使用索引文件,以便實(shí)現(xiàn)對表中的記錄進(jìn)行快速有效的訪問。這些索引文件通常被構(gòu)形在B樹結(jié)構(gòu)中。一份討論B樹的參考文獻(xiàn)是“EfficientLookingForConcurrentOperationonB-Tree”,Lehman和Yao著,《ACMTransactionsonDatabaseSystems》,第6卷第4期,1981年12月,第650頁至第670頁。其它論及B樹結(jié)構(gòu)的參考文獻(xiàn)有“TheUbiquitousB-Tree,Comer著,《ComputingSurveys》,第11卷第2期,1979年6月,第121頁至第137頁,和“ConcurrentOperationonB-TreeWithOverTaking”,Sagiv著,《ProceedingsACMSIGACT-SIGMODSymposiumonPrinciplesofDatabaseSystems》,1985年3月,第28頁至第37頁。
構(gòu)成B樹結(jié)構(gòu)的索引文件包含一個(gè)根節(jié)點(diǎn),多層的節(jié)點(diǎn)從這個(gè)據(jù)根節(jié)點(diǎn)分支出來。包含在這些節(jié)點(diǎn)中的信息包括對下層節(jié)點(diǎn)的指示字或?qū)?shù)據(jù)庫中記錄的指示字。這些指示字中進(jìn)一步包括被稱為關(guān)鍵字記錄信息的信息,這些信息可以引用數(shù)據(jù)庫中的記錄。記錄關(guān)鍵字以有序格式存在于所有節(jié)點(diǎn)中。例如一個(gè)索引樹可以有對雇員姓名按字母順序列的表。根節(jié)點(diǎn)將包括與由下一層節(jié)點(diǎn)間接或直接引用的記錄相關(guān)的引用關(guān)鍵字?jǐn)?shù)據(jù)。引用關(guān)鍵字包含有關(guān)索引文件的信息,即雇員姓名按字母順序的拼法。因此根節(jié)點(diǎn)中的有序關(guān)鍵字將指向下一后續(xù)層的節(jié)點(diǎn)。換句話說,下一后續(xù)節(jié)點(diǎn)可以間接或直接引用所有字母A、B和C開始的雇員姓名。與第一個(gè)后續(xù)節(jié)點(diǎn)并行的另一個(gè)下一后續(xù)節(jié)點(diǎn)可以包含姓氏用字母D-M開始的雇員記錄。這一層上的最后一個(gè)后續(xù)節(jié)點(diǎn)將引用姓氏用字母N-Z開始的雇員記錄。當(dāng)通過索引文件樹進(jìn)行檢索時(shí),最終到達(dá)一個(gè)底節(jié)點(diǎn)。該底節(jié)點(diǎn)的內(nèi)容包括指向存儲器中各個(gè)記錄關(guān)鍵字。
在實(shí)現(xiàn)對數(shù)據(jù)庫表進(jìn)行并行訪問的情況下,當(dāng)多個(gè)事務(wù)同時(shí)試圖對一個(gè)記錄進(jìn)行訪問時(shí),就產(chǎn)生一個(gè)問題。具體地說,當(dāng)一個(gè)用戶想變更一個(gè)記錄,而另一個(gè)用戶想對該記錄進(jìn)行存取時(shí),就會產(chǎn)生爭用狀態(tài)。對于爭用問題的一個(gè)解決方案是對記錄或?qū)樹索引的區(qū)段實(shí)現(xiàn)排他訪問(或封鎖),以便確保索引節(jié)點(diǎn)或記錄在用戶想對它進(jìn)行訪問時(shí)不致被變更。在下述文章中論及了封鎖“IndexLockingandSplitting”,《IBMTechnicalDisclosureBulletin》,第25卷第7B期,1982年12月,第3725頁至3729頁;和“LockingProtocolsforConcurrentOperationsonB-Trees”,《IBMTechnicalDisclosureBulletin》,第19卷第10期,1977年3月,第3887頁至第3889頁。封鎖解決方案的缺點(diǎn)在于當(dāng)允許一個(gè)用戶進(jìn)行訪問時(shí),封鎖阻止了任何其他用戶進(jìn)行的訪問。因此對于本領(lǐng)域的技術(shù)人員顯而易見通過把使用的封鎖次數(shù)減到最小值就能提高系統(tǒng)的并行操作能力。
數(shù)據(jù)處理系統(tǒng)的另一個(gè)重要方面是這種系統(tǒng)具有以可恢復(fù)方式變更包含在數(shù)據(jù)庫中的數(shù)據(jù)的能力。也就是說,這些系統(tǒng)要確保持續(xù)保留特定用戶輸入的所有變更,或在由于各種部件的故障中斷系統(tǒng)操作的情況下,不保留任何變更。同樣也給予用戶一種能力,去請求直到時(shí)間上的某個(gè)特定點(diǎn)之前,把該用戶已經(jīng)對數(shù)據(jù)庫所作的變更撤消。因此,用戶對數(shù)據(jù)庫的變更被稱為“可恢復(fù)的”。這種設(shè)計(jì)方案被編入以“事務(wù)”處理方式操作的數(shù)據(jù)庫系統(tǒng)。一個(gè)事務(wù)是工作的一個(gè)邏輯部件,包括一個(gè)操作序列,這個(gè)操作序列把可恢復(fù)數(shù)據(jù)庫資源的最初一致狀態(tài)變換成另一個(gè)一致狀態(tài),而無需在該序列的所有中間點(diǎn)上保持一致性。使用事務(wù)處理系統(tǒng)將保證如果一個(gè)事務(wù)執(zhí)行對可恢復(fù)數(shù)據(jù)庫資源的某些更新,并且在事務(wù)到達(dá)其正常終端或一個(gè)臨時(shí)一致性點(diǎn)之前發(fā)生故障,那末就取消那些更新。
因?yàn)橐粋€(gè)事務(wù)包括一個(gè)特定應(yīng)用操作序列的執(zhí)行,所以它在系統(tǒng)中的存在通常由一個(gè)特定的“開始工作”(“BEGINWORK”)操作啟動,而由“執(zhí)行”(“COMMIT”)或“異常結(jié)束”(“ABORT”)操作結(jié)束。上述的COMMIT和ABORT操作在系統(tǒng)中具有原子性。在系統(tǒng)中COMMIT操作表示已經(jīng)到達(dá)一個(gè)新的一致性點(diǎn),所有由所涉及的事務(wù)進(jìn)行的更新必須持續(xù)地進(jìn)行。ABORT操作表示已經(jīng)發(fā)生故障,由所涉及的特定事務(wù)進(jìn)行的任何變更都必須“重新進(jìn)行”(“volledback”)或取消變更,可恢復(fù)數(shù)據(jù)庫資源返回到先前的一致性點(diǎn)。
為了實(shí)現(xiàn)這種事務(wù)恢復(fù)保證,數(shù)據(jù)庫系統(tǒng)必須能夠記住那些在執(zhí)行的跨越系統(tǒng)停機(jī)時(shí)間前后的事務(wù)以及其更新操作的狀態(tài),以便當(dāng)系統(tǒng)被重新啟動時(shí),可以正確地反映這些操作對可恢復(fù)數(shù)據(jù)的影響。通過把每個(gè)事務(wù)從開始到結(jié)束的進(jìn)程和那些導(dǎo)致可恢復(fù)數(shù)據(jù)資源變更的操作記錄到存儲在穩(wěn)定存儲器中的一個(gè)運(yùn)行記錄里,就能實(shí)現(xiàn)上述方案。該運(yùn)行記錄就成為一個(gè)資源,用于確保反映事務(wù)已執(zhí)行的操作,或確保其未執(zhí)行的操作被撤消,以便保證數(shù)據(jù)庫保持一致性。當(dāng)事務(wù)操作運(yùn)行記錄反映數(shù)據(jù)目標(biāo)內(nèi)容時(shí),這些運(yùn)行記錄也就成為用于重構(gòu)損壞或丟失數(shù)據(jù)的資源。這些系統(tǒng)通常在記錄被寫入運(yùn)行記錄時(shí),給每個(gè)運(yùn)行記錄賦予一個(gè)特有的運(yùn)行記錄序號(LSN)。這種LSN通常以升序號序列賦值。對數(shù)據(jù)庫中一個(gè)存儲頁面的更新運(yùn)行記錄一完成,一般就把對應(yīng)該更新的那個(gè)運(yùn)行記錄的LSN存儲在該頁面上。
上述這種系統(tǒng)通常稱為運(yùn)行記錄先寫系統(tǒng)。運(yùn)行記錄先寫系統(tǒng)要求在被變更數(shù)據(jù)的新版本更換非易失存儲器中數(shù)據(jù)的在先版本之前,必須把對應(yīng)特定操作的一個(gè)運(yùn)行記錄項(xiàng)目實(shí)際寫入穩(wěn)定存儲器。這里所述的穩(wěn)定存儲器是指非易失存儲器,經(jīng)過系統(tǒng)故障時(shí)間之后它還保持原樣并有效。一個(gè)這種存儲器的實(shí)例就是使用存儲磁盤。此外,這種系統(tǒng)在運(yùn)行記錄中存儲事務(wù)狀態(tài),直到事務(wù)執(zhí)行的狀態(tài)和事務(wù)所有的運(yùn)行記錄數(shù)據(jù)被穩(wěn)定地記錄在穩(wěn)定存儲器中之前,不認(rèn)為該事務(wù)已經(jīng)完成。因此在系統(tǒng)故障的情況下,重新啟動過程將恢復(fù)該事務(wù)中已經(jīng)順利地完成但還沒能先于系統(tǒng)故障把其更新的資源實(shí)際寫入穩(wěn)定存儲器的任何操作。并且在用于該事務(wù)的所有運(yùn)行記錄的所有區(qū)段都被寫入實(shí)際運(yùn)行記錄之前,這種系統(tǒng)不允許事務(wù)去完成COMMIT處理。
本發(fā)明的一個(gè)目的是提供一種更有效的通過索引樹訪問在數(shù)據(jù)庫中的記錄方法。
本發(fā)明的另一個(gè)目的是提供一種更有效的通過索引樹訪問在數(shù)據(jù)庫中的記錄的方法,該方法允許多個(gè)用戶更有效地對數(shù)據(jù)庫進(jìn)行并行訪問。
本發(fā)明還有一個(gè)目的是提供一種更有效的通過索引樹訪問在數(shù)據(jù)庫中的記錄方法,由于樹的結(jié)構(gòu)修改,在訪問中有延遲的情況下無需再一次遍及該樹該方法就使數(shù)據(jù)能被訪問。
上述目的是通過下述的方案實(shí)現(xiàn)的。提供一種方法和裝置,用于在事務(wù)處理系統(tǒng)中索引樹的并行修改。索引樹包括至少一個(gè)根節(jié)點(diǎn),根節(jié)點(diǎn)具有對下一低位層中一個(gè)或多個(gè)節(jié)點(diǎn)的關(guān)鍵字記錄引用,還包括至少一個(gè)實(shí)現(xiàn)對關(guān)鍵字記錄進(jìn)行訪問的底節(jié)點(diǎn)。通過遍及索引樹到被選的節(jié)點(diǎn),然后置位結(jié)構(gòu)修改操作未決的指示,執(zhí)行包括結(jié)構(gòu)修改操作的事務(wù)。在整個(gè)索引樹上,沒有未決結(jié)構(gòu)修改操作指示的位置上允許并行關(guān)鍵字記錄插入或刪除,指示未決結(jié)構(gòu)修改操作的位置上延遲并行關(guān)鍵字記錄插入或刪除。同樣,在事務(wù)未到達(dá)新的一致點(diǎn)的情況下,包括關(guān)鍵字記錄刪除的事務(wù)可以請求結(jié)構(gòu)修改操作,但必須被取消。因此,每個(gè)還未到達(dá)新一致性點(diǎn)的關(guān)鍵字記錄刪除的指示被置位,并且直到結(jié)構(gòu)修改操作的可能性完結(jié)之前,并行關(guān)鍵字記錄插入也被延遲。一旦結(jié)構(gòu)修改操作完成,在系統(tǒng)故障的情況下,無論包含結(jié)構(gòu)修改操作的事務(wù)是否已經(jīng)到達(dá)新的一致性點(diǎn),寫一個(gè)運(yùn)行記錄,該記錄將防止取消結(jié)構(gòu)修改操作。在本發(fā)明的一個(gè)最佳實(shí)施例中,在延遲后研究局部節(jié)點(diǎn),以便判定是否無需再一次遍及樹就能進(jìn)行關(guān)鍵字插入或刪除。
在一起提交的權(quán)利要求中記載了被認(rèn)為是本發(fā)明特征的新穎的技術(shù)特征。當(dāng)結(jié)合附圖閱讀說明書時(shí),通過參看對圖示實(shí)施例的詳細(xì)描述,會極清楚地理解發(fā)明本身和使用的最佳方式以及其它的各種目的和優(yōu)點(diǎn)。
圖1是根據(jù)本發(fā)明的并行訪問數(shù)據(jù)庫系統(tǒng)的方框圖。
圖2是根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的初始檢索操作的邏輯流程圖。
圖3是根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的取操作的邏輯流程圖。
圖4是根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的插入操作的邏輯流程圖。
圖5是根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的刪除操作的邏輯流程圖。
圖6是根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的關(guān)鍵字記錄插入的取消操作的邏輯流程圖。
圖7是根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的關(guān)鍵字記錄刪除的取消操作的邏輯流程圖。
圖8是根據(jù)本發(fā)明的節(jié)點(diǎn)分裂算法的邏輯流程圖。
圖9是根據(jù)本發(fā)明的節(jié)點(diǎn)消失算法的邏輯流程圖。
現(xiàn)在參見附圖,特別是參見附圖1進(jìn)行說明。圖中示出了根據(jù)本發(fā)明的并行訪問數(shù)據(jù)庫系統(tǒng)的方框圖??梢钥闯?,該并行訪問數(shù)據(jù)庫系統(tǒng)包括多個(gè)交互工作站10(IWS),這些交互工作站都連接到主處理機(jī)12。主處理機(jī)12接著連接到數(shù)據(jù)庫14。本領(lǐng)域的技術(shù)人員可以理解盡管這里公開的是一個(gè)特定的實(shí)施例,但還可以使用包括通過局部地區(qū)網(wǎng)絡(luò)連接的各個(gè)計(jì)算機(jī)的類似系統(tǒng)??梢钥闯觯换スぷ髡?0的每個(gè)操作員可以通過數(shù)據(jù)庫管理系統(tǒng)檢索、存取或變更包含在數(shù)據(jù)庫14中的記錄,該數(shù)據(jù)庫管理系統(tǒng)一般包括在主處理機(jī)12中。本領(lǐng)域的技術(shù)人員可以理解一般通過使用索引文件構(gòu)成數(shù)據(jù)庫14,如上述這些索引文件通常構(gòu)形成B樹結(jié)構(gòu)。典型的B樹結(jié)構(gòu)包括至少一個(gè)根節(jié)點(diǎn),多層的節(jié)點(diǎn)從該根節(jié)點(diǎn)分支出來。包含在每個(gè)節(jié)點(diǎn)中的信息包括對下一較低層上節(jié)點(diǎn)的指示字,或在最低層節(jié)點(diǎn)上(通常稱為葉節(jié)點(diǎn))包括對包含在數(shù)據(jù)庫中的記錄的指示字。
現(xiàn)在參見圖2,圖中示出了根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的初始檢索操作的邏輯流程圖??梢钥闯?,該訪問程序由步100開始,接著轉(zhuǎn)到步102,在步102中索引點(diǎn)被S鎖存(S-latch),并被訪問。S鎖存對其他并行用戶提供有限訪問。該有限訪問對其他用戶提供存取和讀包含在該節(jié)點(diǎn)中的信息的權(quán)力。不提供其他類型的訪問,例如刪除或變更的權(quán)力。在本實(shí)施例中索引根節(jié)點(diǎn)識別索引的類型,并提供用于訪問一個(gè)記錄的初始方向。例如,索引根節(jié)點(diǎn)能識別該索引是用于多個(gè)姓名的按字母順序升序排列的索引。在步103中,根據(jù)親代節(jié)點(diǎn)中的信息可以識別出要進(jìn)行訪問的子節(jié)點(diǎn)。如步104中所示,接著判定要執(zhí)行的操作是否是取操作。如果該操作不是取操作,即該操作是記錄插入(或關(guān)鍵字記錄插入)操作,或記錄刪除(或關(guān)鍵字記錄刪除)操作,訪問程序接著轉(zhuǎn)到步106,以便判定在該親代節(jié)點(diǎn)之下的下一節(jié)點(diǎn)是否是底節(jié)點(diǎn)或“葉節(jié)點(diǎn)”。如果下一節(jié)點(diǎn)是葉節(jié)點(diǎn),程序轉(zhuǎn)到步110,得到對子節(jié)點(diǎn)的X鎖存(X-latch)。X鎖存是一種排他鎖存,該鎖存排斥所有其他對這個(gè)特定節(jié)點(diǎn)的訪問。通過把X鎖存用于上述那個(gè)節(jié)點(diǎn),該程序禁止所有其他事務(wù)對這個(gè)特定節(jié)點(diǎn)的訪問。
返回來再看步104,如果該操作是取操作;或返回來倏床 06,如果該子節(jié)點(diǎn)不是葉節(jié)點(diǎn),訪問程序就轉(zhuǎn)到步108,得到對子節(jié)點(diǎn)的S鎖存。訪問程序接著轉(zhuǎn)到步112,判定被檢索的記錄的關(guān)鍵字是否大于該子節(jié)點(diǎn)中的最高關(guān)鍵字。當(dāng)然本領(lǐng)域的技術(shù)人員可以理解在檢索進(jìn)入一個(gè)空節(jié)點(diǎn)的情況下,被檢索的關(guān)鍵字就將自動地被認(rèn)作大于該子節(jié)點(diǎn)中的最高關(guān)鍵字。如果被檢索的關(guān)鍵字記錄大于該子節(jié)點(diǎn)中的最高關(guān)鍵字,該程序轉(zhuǎn)到步114,判定樹索引結(jié)構(gòu)是否被鎖存了。如果該樹未被鎖存,該程序轉(zhuǎn)到步118,對親代節(jié)點(diǎn)和子節(jié)點(diǎn)開鎖,并把該樹鎖存。訪問程序就從步118轉(zhuǎn)回到步102,以便根據(jù)樹鎖存的許可重新啟動操作。本領(lǐng)域的技術(shù)人員應(yīng)能理解,能夠?qū)崿F(xiàn)優(yōu)化設(shè)計(jì),以便當(dāng)重試該操作時(shí),減少必須要被訪問的節(jié)點(diǎn)數(shù)目。
在這個(gè)實(shí)施例中,在樹上提供一種X鎖存,以便對所有其他的訪問指示正在進(jìn)行樹結(jié)構(gòu)中的變更。如果當(dāng)在樹上試圖鎖存時(shí),樹的X鎖存訪問正在進(jìn)行,那未試圖進(jìn)行的訪問必須等到在先訪問完成之后。在樹上提供一種S鎖存,以便對所有其他的訪問指示沒有正在進(jìn)行的結(jié)構(gòu)變更,因而其他訪問可以并行訪問索引樹。直到S鎖存被釋放之前,不會發(fā)生其他變更,與S鎖存或X鎖存的存在無關(guān),可以發(fā)生樹的遍歷。這些樹的遍歷可以包括關(guān)鍵字記錄的刪除或插入。
如果在步114中判定樹已經(jīng)被鎖存,或在步112中判定關(guān)鍵字不大于包含在子節(jié)點(diǎn)中的最高關(guān)鍵字,該程序轉(zhuǎn)到步116,以便判定該子節(jié)點(diǎn)是否是葉節(jié)點(diǎn)。如果該子節(jié)點(diǎn)不是葉節(jié)點(diǎn),該程序轉(zhuǎn)到步115,對親代節(jié)點(diǎn)開鎖,然后返回到步103。然而如果該子節(jié)點(diǎn)是葉節(jié)點(diǎn),該程序轉(zhuǎn)到步120,對親代節(jié)點(diǎn)開鎖,然后轉(zhuǎn)到步122、124和126,判定該操作是否是取操作,插入操作或刪除操作。在圖示的實(shí)施例中,如果試圖完成的操作不是這三種操作的任何一個(gè),則如步130中所示的該程序?qū)⒎祷氐接脩?。在?shí)際使用時(shí),該返回將包括指示本程序不能識別要執(zhí)行的操作的錯(cuò)誤信息。
如果要執(zhí)行的操作是取操作,該訪問程序就轉(zhuǎn)到圖3的步200。圖3中示出了根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的取操作的邏輯流程圖。在圖3的步200中,該程序在數(shù)據(jù)庫中查找正被檢索的請求的關(guān)鍵字或下一較高關(guān)鍵字。在步202中,該程序接著請求在找到的關(guān)鍵字記錄上條件封鎖。在圖示的實(shí)施例中,由管理在記錄關(guān)鍵字上封鎖的數(shù)據(jù)庫管理程序請求條件封鎖。術(shù)語“條件”的意義是如果該封鎖沒有被立即許可,就對請求的存取器發(fā)生響應(yīng),指示這樣一種封鎖現(xiàn)在未被許可。該響應(yīng)用于作出步204中所示的判斷。如果封鎖未被許可,該程序轉(zhuǎn)到步206,對子節(jié)點(diǎn)開鎖,然后轉(zhuǎn)到步208,請求在關(guān)鍵字記錄上無條件封鎖。如步208中所示,對無條件封鎖的請求要求在繼續(xù)執(zhí)行之前存取器等待,直到這種封鎖被許可。一旦該封鎖被許可,該程序接著在步214中重新鎖存子節(jié)點(diǎn),并在步216中判定該節(jié)點(diǎn)是否已經(jīng)變更。在步216中這種對節(jié)點(diǎn)的檢查在這里被稱為“局部檢查”,如果該節(jié)點(diǎn)實(shí)際上沒有變更,利用這種對節(jié)點(diǎn)的檢查,通過允許再從局部節(jié)點(diǎn)開始執(zhí)行程序,而不用再次遍及全樹,提高圖示系統(tǒng)的效率。例如可以通過把存儲在該節(jié)點(diǎn)中的LSN與等待期間之前記錄的LSN比較作出判定。如果該節(jié)點(diǎn)沒有變更,步218接著判定該關(guān)鍵字是否是該局部節(jié)點(diǎn)中的第一關(guān)鍵字。如果不是,如步209所示找到的關(guān)鍵字記錄返回。此后如步210中所示,子節(jié)點(diǎn)被開鎖。在步211中,關(guān)鍵字記錄被開鎖。本領(lǐng)域的技術(shù)人員顯而易見步211將發(fā)生在事務(wù)被完成時(shí)或較早的時(shí)間。
返回來再看步218,如果被鎖存的關(guān)鍵字是該節(jié)點(diǎn)中的第一關(guān)鍵字,該程序就返回到圖2中所示的過程開始的位置,以便再次遍歷樹。由于存在未找到請求的關(guān)鍵字記錄而查找到的下一較高關(guān)鍵字記錄是該局部節(jié)點(diǎn)中的第一關(guān)鍵字的可能性,因此上述的程序返回是必要的。在等待對查找到的關(guān)鍵字記錄進(jìn)行無條件封鎖時(shí)遇到的延遲可能指示在下一較低節(jié)點(diǎn)上已經(jīng)發(fā)生關(guān)鍵字記錄插入,因此可能存在請求的關(guān)鍵字記錄。在這種情況下,必須再次遍歷樹,以便確定請求的關(guān)鍵字記錄是否存在。
返回來再看步216,如果該節(jié)點(diǎn)已經(jīng)被變更,步220接著就判定該節(jié)點(diǎn)是否還象先前的那個(gè)子節(jié)點(diǎn)一樣存在于相同的層中。如果不在相同的樹和相同的層中,就必須再次遍歷樹,以便查找對請求的關(guān)鍵字記錄適當(dāng)?shù)淖庸?jié)點(diǎn)。如果該局部節(jié)點(diǎn)所在的樹和層都是相同的,用步222查找請求的關(guān)鍵字或下一較高關(guān)鍵字(盡管該節(jié)點(diǎn)已變更)。接著用步224判定該程序是否已經(jīng)找到與以前相同的關(guān)鍵字。如果已經(jīng)找到相同的關(guān)鍵字,那未適當(dāng)?shù)年P(guān)鍵字記錄已經(jīng)被查找時(shí),然后如上所述通過步209返回。如果沒有找到相同的關(guān)鍵字,必須再次遍歷樹,以便查找適當(dāng)?shù)淖庸?jié)點(diǎn)。如果在小于請求的關(guān)鍵字記錄的子節(jié)點(diǎn)中確實(shí)存在關(guān)鍵字,那未步226就表示消除在先前找到的關(guān)鍵字記錄上的封鎖,并返回到步200,再次查找請求的關(guān)鍵字或下一較高關(guān)鍵字。
現(xiàn)在參見圖4,圖中示出了根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的插入操作邏輯流程圖。本領(lǐng)域的技術(shù)人員顯而易見在插入操作開始之前,如果有必要,要被插入的關(guān)鍵字記錄將被X封鎖(X-lock)。使用這個(gè)操作把記錄插入計(jì)算機(jī)存儲器,并把被插入的關(guān)鍵字插入索引,更新該索引的相應(yīng)節(jié)點(diǎn),允許其他事務(wù)訪問新插入的記錄。
在步300中,首先判定要被插入的關(guān)鍵字記錄是否適合于底節(jié)點(diǎn)或葉節(jié)點(diǎn)。如果適合,該程序轉(zhuǎn)到步304,以便查找大于要被插入的關(guān)鍵字的下一關(guān)鍵字。如果下一關(guān)鍵字不在該節(jié)點(diǎn)中,該訪問程序指向下一后續(xù)被查找的葉節(jié)點(diǎn)。如果沒有下一后續(xù)被查找的葉節(jié)點(diǎn),該訪問程序就查找到零指示器。接著在步308中,該訪問程序?qū)⑾笤谙乱魂P(guān)鍵字記錄上條件X封鎖。在步312中,判定該條件X封鎖請求是否已經(jīng)被許可。如果已經(jīng)被許可,就用步330判定SMO(結(jié)構(gòu)修改操作)位是否等于0。
SMO位是在葉節(jié)點(diǎn)中的一個(gè)標(biāo)記,它由包括結(jié)構(gòu)修改操作的事務(wù)的未決狀態(tài)置位。根據(jù)本發(fā)明,當(dāng)另一個(gè)用戶的結(jié)構(gòu)修改操作未決時(shí),該標(biāo)記位用于延遲某一用戶的操作。一旦另一個(gè)用戶的結(jié)構(gòu)修改操作已經(jīng)完成,根據(jù)本發(fā)明,該結(jié)構(gòu)修改在系統(tǒng)故障的情況下將不會被取消,此后SMO位將被置0。
接著用步332判定刪除位是否等于0。根據(jù)本發(fā)明的另一個(gè)重要的技術(shù)特征,在每個(gè)葉節(jié)點(diǎn)中設(shè)有一個(gè)刪除位,以便指示上述那個(gè)節(jié)點(diǎn)是可正在參與或已經(jīng)參與一個(gè)刪除操作,而該刪除操作還未到達(dá)新的一致狀態(tài)。考慮到下述實(shí)際情況就能理解上述的判定是重要的,即如果該節(jié)點(diǎn)中設(shè)有保留足夠的空間再插入先前被刪除的位,在到達(dá)一致狀態(tài)之前如果必須取消(UNDO)一個(gè)刪除操作,該先前被刪除的記錄的后續(xù)插入操作可以請求一個(gè)節(jié)點(diǎn)分裂。索引樹結(jié)構(gòu)中的這個(gè)變更可能對并行操作產(chǎn)生不利影響。
因此如果刪除位等于1,直到到達(dá)一個(gè)新的一致性點(diǎn)之前,必須延遲試圖進(jìn)行的關(guān)鍵字記錄操作。如果滿足這兩個(gè)條件,步334表示對插入操作的記錄,這在所有運(yùn)行記錄先寫系統(tǒng)中都是必要的。此后步318把關(guān)鍵字插入上述那個(gè)子節(jié)點(diǎn)。在步324中,對下一記錄和關(guān)鍵字記錄開鎖。此外,按照步329把保持的所有鎖存釋放,接著步325把該程序返回給用戶。
再參見步330和332,如果SMO位等于1,或刪除位等于1,指示結(jié)構(gòu)修改操作的未決狀態(tài)或在UNDO期間必須進(jìn)行結(jié)構(gòu)修改操作的可能性,如步336中所示該訪問程序必須請求在索引樹上條件S鎖存。步338表示判定該鎖存是否已經(jīng)被許可。如果已經(jīng)被許可,在如上面步334和318所述的記錄該插入和執(zhí)行該插入之前,在步340中把SMO位和刪除位置0。
在步336中請求的在樹上條件S鎖存未被許可的情況下,用步324對節(jié)點(diǎn)開鎖,步334表示請求在樹上無條件S鎖存。經(jīng)過一段時(shí)間,無條件S鎖存被許可以后,步346表示重新鎖存上述那個(gè)節(jié)點(diǎn)。接著用步348局部檢查該節(jié)點(diǎn),以便判定該節(jié)點(diǎn)實(shí)際上是否已經(jīng)被變更。如果該節(jié)點(diǎn)未被變更,按照步334和318記錄和插入要被插入的關(guān)鍵字記錄。
在先前找到的節(jié)點(diǎn)實(shí)際上已經(jīng)被變更的情況下,用步350判定發(fā)現(xiàn)的節(jié)點(diǎn)是否在相同的索引樹和相同的層。如如不在相同的索引樹和層,該程序返回到圖2中所示的檢索程序,再次遍歷樹,以便判定適當(dāng)?shù)墓?jié)點(diǎn),在發(fā)現(xiàn)的節(jié)點(diǎn)已經(jīng)被變更,而樹和層是相同的情況下,用步352判定要被插入的關(guān)鍵字是否在該局部節(jié)點(diǎn)上。如果在該局部節(jié)點(diǎn)上,就無需再次遍歷樹,按照步334和318記錄和執(zhí)行該插入操作。如果不在該局部節(jié)點(diǎn)上,如上所述就要再次開始圖2中的檢索過程,以便查找和識別對關(guān)鍵字插入操作適當(dāng)?shù)墓?jié)點(diǎn)。
再參見步312,如果在下一關(guān)鍵字記錄上的條件X封鎖未被許可,該程序轉(zhuǎn)到步316,對子節(jié)點(diǎn)開鎖,接著轉(zhuǎn)到步322請求在下一關(guān)鍵字記錄上無條件X封鎖。在無條件封鎖已經(jīng)被許可之后,步354表示對該節(jié)點(diǎn)重新鎖存,步356表示檢查該節(jié)點(diǎn),以便判定在等待期間該節(jié)點(diǎn)實(shí)際上是否已經(jīng)被變更。如果該節(jié)點(diǎn)未被變更,用步360判定該插入關(guān)鍵字是否在該節(jié)點(diǎn)中。如果在該節(jié)點(diǎn)中,按照步334和318記錄和執(zhí)行該插入操作。
在該節(jié)點(diǎn)已經(jīng)被變更的情況下,用步358判定該節(jié)點(diǎn)所在的樹和層是否仍然是相同的樹和層。如果不是相同的樹和層,就重復(fù)圖2中所示的檢索過程,以便查找適當(dāng)?shù)墓?jié)點(diǎn)。如果該節(jié)點(diǎn)所在的樹和層勻皇竅嗤氖骱筒?,就用?60判定要被插入的關(guān)鍵字記錄是否在該局部節(jié)點(diǎn)中。如果不在該局部節(jié)點(diǎn)中,如上所述重復(fù)圖2中所示的檢索過程。如果要被插入的關(guān)鍵字記錄在該局部節(jié)點(diǎn)上,該程序返回到步300,然后繼續(xù)執(zhí)行上面列舉的過程。返回到步300,如果要被插入的關(guān)鍵字記錄不適合該葉節(jié)點(diǎn),該程序轉(zhuǎn)到步302,請求在索引樹上條件X鎖存。接著步306判定該條件鎖存是否已經(jīng)被許可。如果未被許可,該程序轉(zhuǎn)到步310以便對子節(jié)點(diǎn)開鎖。接著轉(zhuǎn)到步314,請求在索引樹上無條件X鎖存。在索引樹上無條件X鎖存已經(jīng)被許可之后,步362表示對該節(jié)點(diǎn)重新鎖存,接著用步364檢查該局部節(jié)點(diǎn),以便判定在等待期間該節(jié)點(diǎn)是否已經(jīng)被變更。
如果該節(jié)點(diǎn)已經(jīng)被變更,就調(diào)用步320所示的節(jié)點(diǎn)分裂算法(在下文中將更詳細(xì)地?cái)⑹?,然后樹被開鎖,插入過程返回到步300,以便根據(jù)關(guān)鍵字的值把該關(guān)鍵字記錄插入新建立的節(jié)點(diǎn)或原先查找到的節(jié)點(diǎn)上。如果找到的節(jié)點(diǎn)已經(jīng)被變更,就用步366判定該局部節(jié)點(diǎn)所在的樹和層是否繼續(xù)處于相同的樹和層。如果不是相同的樹和層,如上所述該程序返回到圖2中所示的檢索過程,以便查找適當(dāng)?shù)娜~節(jié)點(diǎn)。如果該局部節(jié)點(diǎn)所在的樹和層仍然是相同的樹和層,就用步368判定要被插入的關(guān)鍵字記錄是否在該局部節(jié)點(diǎn)上。如果不在該節(jié)點(diǎn)上,就重復(fù)圖2中所示的檢索過程。如果要被插入的關(guān)鍵字記錄在該節(jié)點(diǎn)上,該程序返回到步300,并繼續(xù)執(zhí)行其后必要的各步,以便插入該關(guān)鍵字記錄。
現(xiàn)在參見圖5,圖中示出了根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的刪除操作邏輯流程圖。本領(lǐng)域的技術(shù)人員顯而易見如果有必要,在刪除操作開始之前,將把要被刪除的關(guān)鍵字記錄X封鎖。在步400中,該程序查找大于要被刪除的關(guān)鍵字的下一關(guān)鍵字。在步402中,該程序請求在該下一記錄關(guān)鍵字上條件X封鎖。該程序轉(zhuǎn)到步404,判定該條件X封鎖是否已經(jīng)被許可。如果請求的條件X封鎖未被許可,該程序轉(zhuǎn)到步406,對子節(jié)點(diǎn)開鎖,接著在步410中請求在該下一關(guān)鍵字記錄上無條件封鎖。
等待該無條件封鎖許可之后,步456表示對子節(jié)點(diǎn)重新鎖存。此后用步458檢查該局部節(jié)點(diǎn),以便判定在等待期間該節(jié)點(diǎn)實(shí)際上是否已經(jīng)被變更。如果未被變更,就用步462判定要被刪除的關(guān)鍵字是否仍然存在。如果仍然存在,該程序返回到步400,以便開始刪除過程。如果不存在,就重復(fù)圖2中的檢索過程。
如果該局部節(jié)點(diǎn)實(shí)際上已經(jīng)被變更了,就用步460判定該節(jié)點(diǎn)所在的樹和層是否繼續(xù)處于相同的樹和層。如果不是相同的樹和層,該程序返回到圖2中所示的檢索過程。如果該局部節(jié)點(diǎn)所在的樹和層仍然是相同的樹和層,就用步462判定要被刪除的關(guān)鍵字是否仍然在該局部節(jié)點(diǎn)中。如果不在該局部節(jié)點(diǎn)中,該程序再次返回到圖2中所示的檢索過程,以便查找適當(dāng)?shù)娜~節(jié)點(diǎn)。但是如果要被刪除的關(guān)鍵字在該局部節(jié)點(diǎn)中,該程序就返回到步400,以便開始刪除過程。
現(xiàn)在返回來再看步404,如果在下一關(guān)鍵字記錄上的條件X封鎖已經(jīng)被許可,就用步432判定要被刪除的關(guān)鍵字是否在該局部節(jié)點(diǎn)上。如果在該局部節(jié)點(diǎn)上,就用步434判定SMO位是否等于0,SMO位等于0指示上述那個(gè)葉節(jié)點(diǎn)未參與尚未完成的結(jié)構(gòu)修改操作。如果SMO位等于0,步436把刪除位置1,指示上述那個(gè)節(jié)點(diǎn)有在一個(gè)事務(wù)中要被刪除的關(guān)鍵字記錄,而該事務(wù)尚未到達(dá)一個(gè)新的一致性點(diǎn)。此后在步437中記錄要被刪除的關(guān)鍵字記錄,接著步408表示該關(guān)鍵字記錄的刪除操作。
在要被刪除的關(guān)鍵字記錄不在該葉節(jié)點(diǎn)上,或SMO位不等于0的情況下,步438表示請求在索引樹上條件S鎖存。通過步440判定,在請求的鎖存已經(jīng)被許可的情況下,步442把SMO位和刪除位置0,接著按照步437和408記錄和完成該刪除操作。如果請求的索引樹條件S鎖存未被許可,步444表示對該節(jié)點(diǎn)開鎖,步446表示請求在索引樹上無條件S鎖存。
等待該無條件S鎖存被許可之后,步448表示對該子節(jié)點(diǎn)重新鎖存,步450表示對該節(jié)點(diǎn)重新局部檢查,以便判定在等待期間該節(jié)點(diǎn)實(shí)際上是否已經(jīng)被變更。如果未被變更,該程序返回到步442,SMO位和刪除位都被置0,接著按照步437和408記錄和完成該刪除操作。如果該局部節(jié)點(diǎn)實(shí)際上已經(jīng)被變更,就用步452判定該節(jié)點(diǎn)是否仍然處于相同的樹和相同的層。在該節(jié)點(diǎn)仍然處于相同的樹和相同的層的情況下,用步454判定要被刪除的關(guān)鍵字記錄是否在該節(jié)點(diǎn)中。如果在該節(jié)點(diǎn)中,該程序返回到步400,以便開始刪除過程。如果該散部節(jié)點(diǎn)不再處于相同的樹或相同的層,或在要被刪除的關(guān)鍵字記錄不在該節(jié)點(diǎn)中的情況下,該程序就返回到圖2中所示募燜鞴?,覇T閎范ǘ隕鮮瞿歉霾僮魘實(shí)鋇囊督詰恪 在按照步408刪除該關(guān)鍵字記錄之后,該程序接著轉(zhuǎn)到步412,以便判定先前包含該關(guān)鍵字記錄的那個(gè)節(jié)點(diǎn)現(xiàn)在是否是空的。如果不是空的,該程序在步421中對該節(jié)點(diǎn)開鎖,然后在步414中返回到操作員。相反,在先前包含被刪除的關(guān)鍵字記錄的那個(gè)節(jié)點(diǎn)是空的情況下,用步416請求在該索引樹上條件X鎖存。接著在步418中,該程序判定該條件鎖存是否已經(jīng)被許可,如果已經(jīng)被許可,該程序轉(zhuǎn)到步424,以便執(zhí)行節(jié)點(diǎn)消失算法(在下文中將更詳細(xì)地?cái)⑹?。節(jié)點(diǎn)消失算法在索引樹中消除該空節(jié)點(diǎn),并消除從先前各節(jié)點(diǎn)對該空節(jié)點(diǎn)的引用。此后,步426表示對該樹開鎖,在步430中把該程序返回到操作員。
再參見步418,在請求的索引樹條件X鎖存未被許可的情況下,步420表示對該子節(jié)點(diǎn)開鎖,接著在步422中請求在該樹上無條件X鎖存。在等待對該索引樹的無條件X鎖存被許可之后,步423接著判定在等待期間上述那個(gè)節(jié)點(diǎn)是否已經(jīng)被變更。如果已經(jīng)被變更,該程序就在步425返回到操作員;如果未被變更,就完成上述的節(jié)點(diǎn)消失算法及其后續(xù)的各步。
現(xiàn)在參見圖6,圖中示出了根據(jù)本發(fā)明通過數(shù)據(jù)庫進(jìn)行的關(guān)鍵字記錄插入的UNDO(取消)操作的邏輯流程圖。本領(lǐng)域的技術(shù)人員會理解在一個(gè)關(guān)鍵字記錄已經(jīng)被插入一個(gè)事務(wù),并且在到達(dá)一個(gè)新的一致性點(diǎn)之前已經(jīng)發(fā)生系統(tǒng)故障的情況下,必須重新執(zhí)行或“UNDO”該關(guān)鍵字記錄插入。這與關(guān)鍵字記錄刪除等效。從圖6中可以看出,在步500中,關(guān)鍵字記錄插入的UNDO的第一步是從運(yùn)行記錄中確定適當(dāng)?shù)墓?jié)點(diǎn)。接著如步502中所示,對該適當(dāng)?shù)墓?jié)點(diǎn)X鎖存。步504用于如果由于該系統(tǒng)的重新啟動該UNDO正在被執(zhí)行,就把SMO位和刪除位置0。接著用步506判定在導(dǎo)致該UNDO的系統(tǒng)停機(jī)之前,上述那個(gè)節(jié)點(diǎn)是否處于相同的樹和相同的層。同樣用步508判定要被刪除的關(guān)鍵字是否在該節(jié)點(diǎn)中。如果樹和層已經(jīng)變化或關(guān)鍵般不在該節(jié)點(diǎn)中,在這兩種情況下該程序都必須返回到圖2中所示的檢索過程。接著用步510判定SMO位是否等于1,該位指示上述那個(gè)節(jié)點(diǎn)已在參與一個(gè)仍然未決的結(jié)構(gòu)修改操作。如果SMO位于等于1,步512表示判定要被刪除的關(guān)鍵字是否是該節(jié)點(diǎn)的第一關(guān)鍵字或最后關(guān)鍵字。如果SMO位等于1,或要被刪除的關(guān)鍵字是該適當(dāng)節(jié)點(diǎn)中的第一關(guān)鍵字,步514表示請求在該樹上條件S鎖存。接著步516判定該鎖存是否已經(jīng)被許可。如果已經(jīng)被許可,步518就把SMO位和刪除位置0。
在SMO位不等于1和要被刪除的關(guān)鍵字不是該適當(dāng)節(jié)點(diǎn)中的第一關(guān)鍵字的情況下,步520表示在完成該關(guān)鍵字記錄刪除之前寫運(yùn)行記錄。此后如步522中所示刪除該關(guān)鍵字記錄,接著用步528判定該節(jié)點(diǎn)現(xiàn)在是否是空的。如果不是空的,該程序在步530中返回到操作員。如果關(guān)鍵字記錄的刪除實(shí)際上已經(jīng)使該節(jié)點(diǎn)變成空的,步532就把該程序轉(zhuǎn)到節(jié)點(diǎn)消失算法,在完成該步之后,步534對該樹開鎖,在步536中把該程序返回到操作員。
現(xiàn)在返回來再看步516,如果請求的在該樹上條件S鎖存未被許可,步524表示釋放該節(jié)點(diǎn)鎖存,在步526中請求在該樹上無條件S鎖存。接著在該無條件S鎖存被許可之后,該程序返回到步502,以便開始該關(guān)鍵字插入操作的UNDO。
現(xiàn)在參見圖7,圖中示出了根據(jù)本發(fā)明的關(guān)鍵字記錄刪除的UNDO操作邏輯流程圖。本領(lǐng)域的技術(shù)人員會理解為了把索引樹保持在一個(gè)一致性點(diǎn),在完成操作之前出現(xiàn)系統(tǒng)故障或其他錯(cuò)誤狀態(tài)的情況下,必須周期地重新執(zhí)行或“UNDO”一個(gè)尚未到達(dá)新的一致狀態(tài)的操作。關(guān)鍵字記錄刪除的UNDO操作方式與關(guān)鍵字記錄插入大致相同。可以看出,第一步是從根據(jù)運(yùn)行記錄先寫協(xié)議已經(jīng)保存的運(yùn)行記錄中確定適當(dāng)?shù)墓?jié)點(diǎn)。這在步600中示出。接著步602表示對該節(jié)點(diǎn)X鎖存。步604表示如果由于系統(tǒng)故障之后的重新啟動該UNDO正在執(zhí)行,就把SMO位和刪除位置0。
用步606判定該節(jié)點(diǎn)是否處于與導(dǎo)致發(fā)生該UNDO之前的狀態(tài)相同的樹和相同的層,如果不在相同的樹和相同的層,就重復(fù)圖2中所示的檢索過程,接著步608表示判定要被該UNDO操作刪除的關(guān)鍵字是否在該節(jié)點(diǎn)中,如果不在該節(jié)點(diǎn)中,也重復(fù)圖2中所示的檢索過程。
如果要被刪除的關(guān)鍵字在該局部節(jié)點(diǎn)上,步610判定SMO位是否等于1,如上所述指示上述那個(gè)節(jié)點(diǎn)涉及一個(gè)未決結(jié)構(gòu)修改操作。如果SMO位不等于1,步612判定刪除位是否等于1,以便確定上述那個(gè)節(jié)點(diǎn)最近是否有一個(gè)在某個(gè)尚未到達(dá)一致性點(diǎn)的事務(wù)中的要被刪除的記錄。
如果SMO位和刪除位都不等于1,該程序就轉(zhuǎn)到步624,以便判定要被插入的關(guān)鍵字記錄是否適合該適當(dāng)?shù)墓?jié)點(diǎn)。再參見步610和612,如果SMO位或刪除位等于1,步614表示在樹上條件S鎖存。步616接著判定該S鎖存是否已經(jīng)被許否,如果已經(jīng)被許可,就在按照步624所述判定要被插入的關(guān)鍵字是否適合該節(jié)點(diǎn)之前,用步622把SMO位和刪除位置0。
在步614中請求的在該樹上條件S鎖存未被許可的情況下,接著步618表示釋放該節(jié)點(diǎn)鎖存,并在步620中請求在該樹上無條件S鎖存。在該樹上無條件S鎖存已經(jīng)被許可之后,該程序返回到步602,在步602該節(jié)點(diǎn)被X鎖存,重新開始該過程。
再參見步624,如果要被插入的關(guān)鍵字記錄不適合于該適當(dāng)?shù)墓?jié)點(diǎn),步626表示調(diào)用節(jié)點(diǎn)分裂算法。在節(jié)點(diǎn)分裂算法已經(jīng)完成之后,步628表示對該樹開鎖,該程序再返回到步602,以便重新開始該過程。在要被插入的關(guān)鍵字記錄適合于該適當(dāng)節(jié)點(diǎn)的情況下,步630表示在步632中完成該插入之前寫一個(gè)運(yùn)行記錄,插入完成之后,該程序在步634返回到用戶。
現(xiàn)在參見圖8,圖中示出了根據(jù)本發(fā)明的節(jié)點(diǎn)分裂算法的邏輯流程圖??梢钥闯?,通過存儲一個(gè)專用運(yùn)行記錄序號開始該節(jié)點(diǎn)分裂算法,該序號與在該節(jié)點(diǎn)分裂操作之前剛完成的那個(gè)操作相關(guān)。本領(lǐng)域的技術(shù)人員會理解在一個(gè)在前傳輸?shù)氖聞?wù)中,這個(gè)運(yùn)行記錄序號是在該節(jié)點(diǎn)分裂算法之前剛完成的那個(gè)操作的運(yùn)行記錄序號;而在一個(gè)請求節(jié)點(diǎn)分裂操作的UNDO中,這個(gè)運(yùn)行記錄序號是就在上述那個(gè)操作之后剛發(fā)生的操作的運(yùn)行記錄序號。
接著如步702中所示該樹被X鎖存,然后如步704中所示,根據(jù)運(yùn)行記錄先寫協(xié)議記錄該新節(jié)點(diǎn)請求。步706用于得到新的節(jié)點(diǎn),步708表示如果有必要,就對新節(jié)點(diǎn)和過去的節(jié)點(diǎn)X鎖存。在步710中,根據(jù)運(yùn)行記錄先寫協(xié)議,在步712把關(guān)鍵字的區(qū)段從過去的節(jié)點(diǎn)移到一個(gè)新的節(jié)點(diǎn)之前,把對關(guān)鍵字位置的變更寫入運(yùn)行記錄。步712還把已經(jīng)改變的那個(gè)葉節(jié)點(diǎn)中的SMO位置1,以便并行的用戶可以判定上述那個(gè)節(jié)點(diǎn)涉及一個(gè)尚未完成的結(jié)構(gòu)修改操作。
接著如步714中所示對過去的和新的節(jié)點(diǎn)開鎖,在步716中對親代節(jié)點(diǎn)X鎖存。任何在親代節(jié)點(diǎn)中必要的變更都在步718中被記錄,并在步720中更新該親代節(jié)點(diǎn)。接著如在步722中所示,對該親代節(jié)點(diǎn)開鎖,并把偽補(bǔ)償運(yùn)行記錄(CLR)寫入運(yùn)行記錄存儲器,該運(yùn)行記錄指向存儲的相應(yīng)運(yùn)行序號(LNS)。本領(lǐng)域的技術(shù)人員會理解,綜合運(yùn)行記錄是一種確定UNDO發(fā)生的位置或時(shí)間點(diǎn),并識別在該時(shí)間點(diǎn)上有多個(gè)操作和什么操作被取消的運(yùn)行記錄。按照這種方式,盡管在涉及的事務(wù)到達(dá)一個(gè)新的一致性點(diǎn)之前系統(tǒng)可能發(fā)生故障,那個(gè)剛被完成的結(jié)構(gòu)修改操作也不會被取消。如果發(fā)生這樣的故障,偽CLR記錄將導(dǎo)致取消算法,以便跳越到就在該結(jié)構(gòu)修改操作執(zhí)行的開始處之前發(fā)生的那個(gè)操作。因此,如果結(jié)構(gòu)修改操作未被完成,任何涉及結(jié)構(gòu)修改操作的事務(wù)都會被全部重新執(zhí)行,但是如果在系統(tǒng)停機(jī)或正常處理期間事務(wù)ABORT之前,該結(jié)構(gòu)修改操作已經(jīng)被完成,就將僅重新執(zhí)行非結(jié)構(gòu)修改操作。應(yīng)該注意盡管包含結(jié)構(gòu)修改的完成執(zhí)行狀態(tài)的事務(wù)發(fā)生故障,上述方案也將有效地禁止取消已經(jīng)被完成的結(jié)構(gòu)修改。按照這種方式,由于該系統(tǒng)具有無需要求事務(wù)完成執(zhí)行狀態(tài)就能執(zhí)行結(jié)構(gòu)修改的能力,因此可以得到高度的并行操作性能。
最后參見圖9,圖中示出了根據(jù)本發(fā)明的節(jié)點(diǎn)消失算法的邏輯流程圖??梢钥闯?,以與節(jié)點(diǎn)分裂算法相似的方式,在步800中通過存儲一個(gè)專用LSN開始該過程。接著按照步802對該樹X鎖存,按照步804如果有必要對相鄰的和過去的節(jié)點(diǎn)X鎖存。
根據(jù)上述的運(yùn)行記錄先寫協(xié)議,按照步806記錄該節(jié)點(diǎn)消失關(guān)鍵字移動,接著步808表示從相鄰節(jié)點(diǎn)把關(guān)被字移動到空節(jié)點(diǎn)。步808還表示把SMO位置1,對并行的用戶指示對該特定節(jié)點(diǎn)的一個(gè)未決結(jié)構(gòu)修改操作正在執(zhí)行。接著同步810更新前向節(jié)點(diǎn)指示字,用步812消除該相鄰節(jié)點(diǎn)。
按照步814接著對子節(jié)點(diǎn)和相鄰節(jié)點(diǎn)開鎖,在變更親代節(jié)點(diǎn)之前,按照步816對親代節(jié)點(diǎn)X鎖存。步818表示在完成步820中所示的變更之前,記錄對親代節(jié)點(diǎn)的變更。此后在步822中對親代節(jié)點(diǎn)開鎖,在步824中寫指向存儲的專用運(yùn)行記錄序號(LSN)的偽補(bǔ)償運(yùn)行記錄(CLR)。
本領(lǐng)域的技術(shù)人員會理解在上述的節(jié)點(diǎn)分裂和節(jié)點(diǎn)消失兩種算法中,在結(jié)構(gòu)修改操作被完成之后,SMO位可以在任何時(shí)間以任何適當(dāng)?shù)姆绞街?。根據(jù)鮮瞿諶藎玖煊虻募際躒嗽被嶗斫猓荷昵肴艘丫峁┝艘恢鐘糜讜謔攣翊硐低持卸運(yùn)饕韃⑿行薷牡姆椒ê妥爸?,除翣q檬魃轄峁剮薷牟僮魑淳齙哪切┣蛑?,通过允许灾q鍪魃現(xiàn)蔥泄丶旨鍬嫉牟迦牒蛻境?,使该蕯侎处理系蛪m哂懈叨炔⑿脅僮饜閱堋 此外,一旦結(jié)構(gòu)修改操作被完成,用偽補(bǔ)償運(yùn)行記錄確保盡管在上述那個(gè)事務(wù)到達(dá)一個(gè)新的一致性點(diǎn)之前系統(tǒng)停機(jī),該結(jié)構(gòu)修改操作也不會被取消。用這種方式,保持了索引樹的實(shí)際一致性,由保持一致性而產(chǎn)生的高度的并行操作將提高多個(gè)并行用戶對該索引樹的利用率。
同樣,在剛發(fā)生刪除操作的節(jié)點(diǎn)中使用一個(gè)標(biāo)記位將延遲關(guān)鍵字記錄的插入,否則由于在UNDO期間發(fā)生的結(jié)構(gòu)修改操作可能會影響該關(guān)鍵字記錄的插入。一旦包含記錄刪除的事務(wù)已經(jīng)到達(dá)一致狀態(tài),該刪除位再次被置0,允許執(zhí)行任何被延遲的關(guān)鍵字記錄插入。
本領(lǐng)域的技術(shù)人員會理解盡管本說明書中所述的各種操作一般涉及在葉節(jié)點(diǎn)中發(fā)生的操作,但是這種節(jié)點(diǎn)分裂和節(jié)點(diǎn)消失操作會經(jīng)常導(dǎo)致相同的操作沿樹向上擴(kuò)展直到根節(jié)點(diǎn)。應(yīng)能理解本發(fā)明書中所公開的方法同樣適用于那些較高層的各種操作。
雖然通過參考一個(gè)最佳實(shí)施例已經(jīng)詳細(xì)地公開和說明了本發(fā)明,但是本領(lǐng)域的技術(shù)人員會理解無需脫離本發(fā)明的精神和保護(hù)范圍,就可以作出各種形式上和細(xì)節(jié)上的改變。
權(quán)利要求
1.一種用于在執(zhí)行包括多個(gè)操作(該多個(gè)操作至少包括一個(gè)結(jié)構(gòu)修改操作)的事務(wù)期間允許在索引樹中訪問高度并行操作的方法,其特征是由以下步驟組成順序執(zhí)行所述多個(gè)操作;存儲一個(gè)在所述結(jié)構(gòu)修改操作之前執(zhí)行的被選操作順序的指示;根據(jù)所述結(jié)構(gòu)修改操作的完成,寫一個(gè)指向所述被選操作順序的所述存儲指示的記錄;在所述結(jié)構(gòu)修改操作完成之前所述事務(wù)終止的情況下,重新執(zhí)行所述多個(gè)操作中的每個(gè)操作;在所述結(jié)構(gòu)修改操作完成之后所述事務(wù)終止的情況下,僅重新執(zhí)行目的不是結(jié)構(gòu)修改的那些操作。
2.根據(jù)權(quán)利要求1所述的方法,其特征是在所述結(jié)構(gòu)修改操作完成之后所述事務(wù)終止的情況下,僅重新執(zhí)行目的不是結(jié)構(gòu)修改的那些操作的所述步驟的特征還在于在重新執(zhí)行期間使用指向所述被選操作的所述存儲指示的所述記錄,以便越過所述結(jié)構(gòu)修改操作。
3.一種用于在執(zhí)行包括多個(gè)操作(該多個(gè)操作至少包括一個(gè)結(jié)構(gòu)修改操作)的事務(wù)期間,通過索引樹的訪問數(shù)據(jù)的并行訪問數(shù)據(jù)庫系統(tǒng),其特征是由以下裝置組成用于順序執(zhí)行所述多個(gè)操作的裝置;用于存儲一個(gè)在所述結(jié)構(gòu)修改操作之前執(zhí)行的被選操作順序位置的指示的裝置;用于根據(jù)所述結(jié)構(gòu)修改操作的完成,存儲一個(gè)補(bǔ)償運(yùn)行記錄的裝置,該補(bǔ)償運(yùn)行記錄指向所述被選操作順序位置的所述存儲指示;控制裝置,用于在所述結(jié)構(gòu)結(jié)構(gòu)修改操作完成之前所述事務(wù)終止的情況下,重新執(zhí)行所述多個(gè)操作中的每個(gè)操作;在所述結(jié)構(gòu)修改操作完成之后所述事務(wù)終止的情況下,僅重新執(zhí)行目的不是結(jié)構(gòu)修改的那些操作。
4.一種用于在一個(gè)系統(tǒng)中執(zhí)行一個(gè)事務(wù)期間通過索引樹使用關(guān)鍵字記錄的一個(gè)區(qū)段在成組的記錄關(guān)鍵字中取關(guān)鍵字記錄數(shù)據(jù)的方法,在所述系統(tǒng)中其他事務(wù)可以并修改所述索引樹的結(jié)構(gòu),所述索引樹具有至少一個(gè)根節(jié)點(diǎn),每個(gè)根節(jié)點(diǎn)具有對下較低位層中一個(gè)或多個(gè)節(jié)點(diǎn)的關(guān)鍵字記錄引用,所述索引樹還具有提供對所述關(guān)鍵字記錄數(shù)據(jù)訪問的底節(jié)點(diǎn),這個(gè)方法的特征是由以下步驟組成通過使用所述關(guān)鍵字記錄引用,從所述根節(jié)點(diǎn)遍歷所述各層節(jié)點(diǎn),直到到達(dá)一個(gè)適當(dāng)?shù)牡坠?jié)點(diǎn);識別在所述底節(jié)點(diǎn)中的所述關(guān)鍵字記錄;請求在所述被識別的關(guān)鍵字記錄上條件訪問限制;在所述條件訪問限制被許可的情況下,取所述關(guān)鍵字記錄;在所述條件訪問限制未被許可的情況下,請求在所述被識別的關(guān)鍵字記錄上無條件訪問限制;在所述無條件訪問限制被許可之后,檢查所述適當(dāng)?shù)牡坠?jié)點(diǎn),以便判定所述適當(dāng)?shù)牡坠?jié)點(diǎn)實(shí)際上是否已經(jīng)被變更;在所述適當(dāng)?shù)牡坠?jié)點(diǎn)實(shí)際上未被變更的情況下,取消所述關(guān)鍵字記錄;在所述先前適當(dāng)?shù)牡坠?jié)點(diǎn)實(shí)際上已經(jīng)被變更的情況下,通過使用所述關(guān)鍵字記錄引用,從所述根節(jié)點(diǎn)遍歷所述各層節(jié)點(diǎn),直到到達(dá)一個(gè)新的適當(dāng)?shù)牡坠?jié)點(diǎn)。
5.根據(jù)權(quán)利要求4所述的方法,其特征是在所述無條件訪問限制被許可之后,檢查所述適當(dāng)?shù)牡坠?jié)點(diǎn),以便判定所述適當(dāng)?shù)牡坠?jié)點(diǎn)實(shí)際上是否已經(jīng)被變更的所述步驟還包括如下步驟判定被識別的關(guān)鍵字記錄是否是所述適當(dāng)?shù)牡坠?jié)點(diǎn)中的第一關(guān)鍵字記錄。
6.根據(jù)權(quán)利要求4所述的方法,其特征是在所述無條件訪問限制被許可之后,檢查所述適當(dāng)?shù)牡坠?jié)點(diǎn),以便判定所述適當(dāng)?shù)牡坠?jié)點(diǎn)實(shí)際上是否已經(jīng)被變更的所述步驟還包括如下步驟判定在所述適當(dāng)?shù)坠?jié)點(diǎn)中的下一較低關(guān)鍵字記錄是否低于請求的關(guān)鍵字記錄。
7.根據(jù)權(quán)利要求4所述的方法,其特征是在所述無條件訪問限制被許可之后,檢查所述適當(dāng)?shù)牡坠?jié)點(diǎn),以便判定所述適當(dāng)?shù)牡坠?jié)點(diǎn)實(shí)際上是否已經(jīng)被變更的所述步驟還包括如下步驟判定低于請求的關(guān)鍵字記錄的一個(gè)關(guān)鍵字記錄是否存在于所述適當(dāng)?shù)牡坠?jié)點(diǎn)中。
8.一種用于在一個(gè)系統(tǒng)中執(zhí)行一個(gè)事務(wù)期間通過索引樹根據(jù)關(guān)鍵字記錄把一個(gè)單關(guān)鍵字記錄插入成組記錄關(guān)鍵字中的方法,在所述系統(tǒng)中其他事務(wù)可以并行修改所述索引樹的結(jié)構(gòu),所述索引樹具有至少一個(gè)根節(jié)點(diǎn),每個(gè)根節(jié)點(diǎn)具有對下一較低位層中一個(gè)或多個(gè)節(jié)點(diǎn)的關(guān)鍵字記錄引用,所述索引樹還具有提供對所述記錄關(guān)鍵字訪問的底節(jié)點(diǎn),這個(gè)方法的特征是由以下步驟組成通過使用所述關(guān)鍵字記錄引用,從所述根節(jié)點(diǎn)遍歷所述各層節(jié)點(diǎn),直到到達(dá)一個(gè)適當(dāng)?shù)牡坠?jié)點(diǎn);識別高于要被插入的單關(guān)鍵字記錄的下一較高關(guān)鍵字記錄;請求在所述下一較高關(guān)鍵字記錄上條件訪問限制;如果所述條件訪問限制被許可,把所述單關(guān)鍵字記錄插入所述適當(dāng)?shù)牡坠?jié)點(diǎn);在所述條件訪問限制未被許可的情況下,請求在所述下一較高關(guān)鍵字記錄上無條件訪問限制;在所述無條件訪問限制被許可之后,檢查所述適當(dāng)?shù)牡坠?jié)點(diǎn),以便判定所述適當(dāng)?shù)牡坠?jié)點(diǎn)實(shí)際上是否已經(jīng)被變更;在所述適當(dāng)?shù)牡坠?jié)點(diǎn)實(shí)際上未被變更的情況下,把所述單關(guān)鍵字記錄插入所述適當(dāng)?shù)牡坠?jié)點(diǎn);在所述最初適當(dāng)?shù)墓?jié)點(diǎn)實(shí)際上已經(jīng)被變更的情況下,通過使用所述關(guān)鍵字記錄引用,從所述根節(jié)點(diǎn)遍歷所述各層節(jié)點(diǎn),直到到達(dá)另一個(gè)適當(dāng)?shù)墓?jié)點(diǎn)。
9.根據(jù)權(quán)利要求8所述的方法,其特征是在所述無條件訪問限制被許可之后,檢查所述適當(dāng)?shù)牡坠?jié)點(diǎn)的步驟還包括如下步驟判定所述單關(guān)鍵字記錄是否在所述適當(dāng)?shù)牡坠?jié)點(diǎn)上。
10.根據(jù)權(quán)利要求8所述的方法,其特征是在所述無條件訪問限制被許可之后,檢查所述適當(dāng)?shù)牡坠?jié)點(diǎn)的步驟還包括如下步驟判定所述適當(dāng)?shù)牡坠?jié)點(diǎn)是否正在參與一個(gè)尚未完成的結(jié)構(gòu)修改操作。
11.一種用于在一個(gè)系統(tǒng)中執(zhí)行一個(gè)事務(wù)期間通過索引樹根據(jù)關(guān)鍵字記錄刪除成組記錄關(guān)鍵字中的一個(gè)單關(guān)鍵字記錄的方法,在所述系統(tǒng)中其他事務(wù)可以并行修改所述索引樹的結(jié)構(gòu),所述索引樹具有至少一個(gè)根節(jié)點(diǎn),每個(gè)根節(jié)點(diǎn)具有對下一較低位層中一個(gè)或多個(gè)節(jié)點(diǎn)的關(guān)鍵字記錄引用,所述索引樹還具有提供對所述記錄關(guān)鍵字訪問的底節(jié)點(diǎn),該方法的特征是由以下步驟組成通過使用所述關(guān)鍵字記錄引用,從所述根節(jié)點(diǎn)遍歷所述各層節(jié)點(diǎn),直到到達(dá)一個(gè)適當(dāng)?shù)牡坠?jié)點(diǎn);請求在高于要被刪除的單關(guān)鍵字記錄的下一較高關(guān)鍵字記錄上條件訪問限制;如果所述條件訪問限制被許可,從所述適當(dāng)?shù)牡坠?jié)點(diǎn)刪除所述單關(guān)鍵字記錄;在所述條件訪問限制未被許可的情況下,請求在所述下一較高關(guān)鍵字記錄上無條件訪問限制;在所述無條件訪問限制被許可之后,檢查所述適當(dāng)?shù)牡坠?jié)點(diǎn),以便判定所述適當(dāng)?shù)牡坠?jié)點(diǎn)上是否已經(jīng)被變更;在所述適當(dāng)?shù)牡坠?jié)點(diǎn)實(shí)際上未被變更的情況下,從所述適當(dāng)?shù)牡坠?jié)點(diǎn)刪除所述單關(guān)對字記錄;在所述最初適當(dāng)?shù)墓?jié)點(diǎn)實(shí)際上已經(jīng)被變更的情況下,通過使用所述關(guān)鍵字記錄引用,從所述根節(jié)點(diǎn)遍歷所述各層節(jié)點(diǎn),直到到達(dá)另一個(gè)適當(dāng)?shù)墓?jié)點(diǎn)。
12.根據(jù)權(quán)利要求11所述的方法,其特征是在所述無條件訪問限制被許可之后,檢查所述適當(dāng)?shù)牡坠?jié)點(diǎn)的步驟還包括如下步驟判定所述適當(dāng)?shù)牡坠?jié)點(diǎn)是否正在參與一個(gè)尚未完成的結(jié)構(gòu)修改操作。
13.一種用于在執(zhí)行包括結(jié)構(gòu)修改操作的事務(wù)期間,允許在索引樹中選擇的關(guān)鍵字記錄插入和關(guān)鍵字記錄刪除的方法,所述索引樹具有至少一個(gè)根節(jié)點(diǎn),每個(gè)根節(jié)點(diǎn)具有對下一較低位層中一個(gè)或多個(gè)節(jié)點(diǎn)的關(guān)鍵字記錄引用,所述索引樹還具有提供對關(guān)鍵字記錄訪問的底節(jié)點(diǎn),該方法的特征是由以下步驟組成通過使用所述關(guān)鍵字記錄引用,從所述根節(jié)點(diǎn)遍歷所述各層節(jié)點(diǎn),直到到達(dá)一個(gè)用于由所述結(jié)構(gòu)修改操作進(jìn)行修改的被選節(jié)點(diǎn);在所述結(jié)構(gòu)修改操作未決的被選節(jié)點(diǎn)提供一個(gè)指示;在任何具有結(jié)構(gòu)修改操作未決指示的節(jié)點(diǎn)上,延遲關(guān)鍵字記錄插入和關(guān)鍵字記錄刪除;根據(jù)所述結(jié)構(gòu)修改操作的完成,消除被選節(jié)點(diǎn)上的所述指示。
14.一種用于在執(zhí)行包括結(jié)構(gòu)修改操作的事務(wù)期間,通過索引樹插入和刪除關(guān)鍵字記錄的并行訪問數(shù)據(jù)庫系統(tǒng),所述索引樹具有至少一個(gè)根節(jié)點(diǎn),每個(gè)根節(jié)點(diǎn)具有對下一較低位層中一個(gè)或多個(gè)節(jié)點(diǎn)的關(guān)鍵字記錄引用,所述索引樹還具有提供對所述關(guān)鍵字記錄訪問的底節(jié)點(diǎn),該系統(tǒng)特征是由以下裝置組成訪問裝置,用于通過使用所述關(guān)鍵字記錄引用,從所述根節(jié)點(diǎn)遍歷所述各層節(jié)點(diǎn),直到到達(dá)一個(gè)用于所述結(jié)構(gòu)修改操作進(jìn)行修改的被選節(jié)點(diǎn);標(biāo)志裝置,用于在所述結(jié)構(gòu)修改操作未決的被選節(jié)點(diǎn)上提供一個(gè)指示;控制裝置,用于在任何具有結(jié)構(gòu)修改操作未決指示的節(jié)點(diǎn)上,延遲關(guān)鍵字記錄插入和關(guān)鍵字記錄刪除;用于根據(jù)所述結(jié)構(gòu)修改操作的完成,消除被選用點(diǎn)上的所述指示的裝置。
15.一種用于在執(zhí)行可以請求結(jié)構(gòu)修改操作的事務(wù)期間在該事務(wù)完成之前系統(tǒng)故障的情況下允許在索引樹中選擇的關(guān)鍵字插入的方法,所述索引樹的具有至少一個(gè)根節(jié)點(diǎn),每個(gè)根節(jié)點(diǎn)具有對下一較低位層中一個(gè)或多個(gè)節(jié)點(diǎn)的關(guān)鍵字記錄引用,所述索引樹還具有提供對關(guān)鍵字記錄訪問的底節(jié)點(diǎn),該方法特征是由以下步驟組成通過使用所述關(guān)鍵字記錄引用,從所述根節(jié)點(diǎn)遍歷所述各層節(jié)點(diǎn),直到到達(dá)一個(gè)用于關(guān)鍵字記錄刪除的被選節(jié)點(diǎn);在關(guān)鍵字記錄刪除未決的被選節(jié)點(diǎn)上提供一個(gè)指示;在任何具有關(guān)鍵字記錄刪除未決指示的節(jié)點(diǎn)上,延遲關(guān)鍵字插入;當(dāng)結(jié)構(gòu)修改操作的可能性不再存在時(shí),消除所述被選節(jié)點(diǎn)上的所述指示。
全文摘要
本方法和裝置允許并行修改事務(wù)處理系統(tǒng)索引樹。遍及索引樹到被選節(jié)點(diǎn)執(zhí)行包括結(jié)構(gòu)修改操作的事務(wù),然后置位結(jié)構(gòu)修改操作未決指示。在沒有未決結(jié)構(gòu)修改操作指示的位置,允許通過索引樹執(zhí)行并行關(guān)鍵字記錄插入或刪除;在指示未決結(jié)構(gòu)修改操作的位置,延遲并行關(guān)鍵字記錄插入或刪除。每個(gè)尚未到達(dá)新的一致性點(diǎn)的關(guān)鍵字記錄刪除的指示被置位,并行關(guān)鍵字記錄插入或刪除也被延遲,直到結(jié)構(gòu)修改操作的可能性結(jié)束。
文檔編號G06F12/00GK1037044SQ8910206
公開日1989年11月8日 申請日期1989年4月7日 優(yōu)先權(quán)日1988年4月8日
發(fā)明者弗蘭克·埃略特·來弗尼, 坎德拉塞卡蘭·莫漢 申請人:國際商業(yè)機(jī)器公司