專利名稱:在多版本數據庫系統(tǒng)中的萬圣夜保護的制作方法
技術領域:
本發(fā)明涉及數據庫,尤其涉及在多版本數據庫系統(tǒng)中的萬圣夜保護(Halloween protection)0
背景技術:
背景和相關技術計算機和計算系統(tǒng)已經影響到了現(xiàn)代生活的幾乎每個方面。計算機通常在工作、 消遣、保健、運輸、娛樂、家政管理等中都有涉獵。計算系統(tǒng)中的數據通常存儲在一個或多個數據庫中。數據庫是相關數據的集合。 數據庫中的數據通常以二維的行和列的形式(稱為表格)來組織的。數據庫通常包括多個表格和多個關聯(lián)結構。表格是數據庫中的對象,包括零個或更多記錄以及在每個記錄中的至少一個字段。記錄可被實現(xiàn)為表格中的行,所述記錄被稱為記錄標識符的唯一數字所標識。字段是記錄的細分,在這個意義上而言,表格中的一列數據代表表格中的每個記錄的相同字段。數據庫中的關聯(lián)結構的示例是索引,通常,但不是必須的,B樹或散列索引的形式。 關聯(lián)結構對數據庫的用戶透明,但是對高效操作和控制數據庫管理系統(tǒng)是重要的。數據庫管理系統(tǒng)是支持數據庫特征的控制系統(tǒng),數據庫特征包括但不限于,將數據存儲在存儲介質上,從存儲介質檢索數據,以及更新存儲介質上的數據。查詢用于訪問或更新數據庫中的數據。查詢通常以結構化查詢語言(SQL)的變體來構造,該變體可以或可以不符合美國國家標準協(xié)會(ANSI)標準SQL定義。SQL查詢是非程序性的,因為它以對用戶有意義的語言來指定目標或期望的查詢結果,但不定義查詢應該被實現(xiàn)的步驟或過程。當SQL查詢被用于數據庫時,數據庫管理系統(tǒng)的查詢優(yōu)化器處理該非程序性查詢以創(chuàng)建執(zhí)行計劃。執(zhí)行計劃是程序性的,因為它確定為實現(xiàn)SQL查詢的目標所要執(zhí)行的運算和算子的次序和類型。非程序性更新請求(SQL查詢)和程序性執(zhí)行計劃的組合創(chuàng)建了查詢優(yōu)化器對執(zhí)行計劃的自動計劃的機會和需求。查詢優(yōu)化器可為任何給定的SQL查詢生成多個不同的查詢計劃,并且通常配置為按照高效目標生成查詢計劃。更新是對數據庫中的數據執(zhí)行的通用類型的查詢。更新是修改數據庫中的現(xiàn)存記錄及插入和刪除數據庫中的記錄的任何操作。如此處所使用的,更新包括任何數據庫修改, 包括值的修改(狹義更新)、插入、刪除、更新插入(upsert)(更新和插入的組合,如果數據庫中存在就更新或者如果不存在就插入)、合并等。執(zhí)行計劃的語義可用SLQ語言的ANSI/ ISO標準來規(guī)定。根據該標準,任何更新語句的語義與執(zhí)行的三個獨立階段相同,各階段之間沒有重疊。首先,數據庫的只讀搜索確定要更新、插入,或刪除的記錄以及新列值。其次, 更新記錄和列。第三,驗證為數據庫定義的一致性約束。對表格中的記錄的更新還包括對索引中的索引條目及與所更新表格相關聯(lián)的其他關聯(lián)結構的更新。對關聯(lián)結構的改變,實際上關聯(lián)結構它們本身,通常對用戶不可見,因為它們因執(zhí)行計劃的程序性執(zhí)行而弓I起。每當定位了滿足查詢表述的記錄時,使用每次一記錄(record-at-a-time)流水線操作(pipelining)的算子完全處理(即產生)輸出。使用每次一組(set-at-a-time) 流水線操作的算子消耗它的全部輸入,并僅在那時從該算子中產生輸出。每次一記錄的處理在小的表間關系(cardinality)改變的傳統(tǒng)系統(tǒng)中可能更高效。大的表間關系的改變可能用每次一組的方法更高效,因為它可利用順序IO而非針對傳統(tǒng)盤驅動器的隨機IO來排序記錄并執(zhí)行改變。在數據庫更新領域存在被稱為萬圣夜問題(Halloween problem)的具體問題。自從IBM的Jose研究實驗室的研究人員在1975年的萬圣節(jié)前夜首次注意到它,萬圣夜問題已經是公知的了。數據庫系統(tǒng)中的萬圣夜問題在產生了不正確結果的數據修改語句 (插入、更新,和刪除)中可能是明顯的,因為修改數據庫狀態(tài)的過程改變了執(zhí)行語句的行為,并促使其修改了錯誤的一組記錄(歸因于跳過記錄或歸因于多次修改相同記錄)。萬圣夜問題的典型示例是對“給薪水超過$30,000的所有員工5%的提高”的請求(SQL查詢)。如果⑴使用對薪水的索引來發(fā)現(xiàn)這些員工,以及(ii)以薪水遞增次序掃描索引條目,以及(iii)掃描不能區(qū)分該請求已經更新的索引條目以及那些還未更新的條目,以及(iv)當找到索引條目時立刻更新索引(每次一記錄流水線),那么每個有資格的員工將獲得無限數量的提高。因此,處理該請求將不會終止。對萬圣夜問題的一種簡單解決方案是物理階段隔離,其中對要修改的這組記錄的標識以及對這些記錄的實際修改是串行運行的(一個接一個)而非并發(fā)運行。在一個簡單示例中,使用諸如假脫機(spool)的阻塞算子(blocking operator)來獲得物理階段隔離。 更復雜的解決方案包括充分利用底層查詢處理器和存儲引擎的行為的詳細知識來生成計劃和/或來分析并證實所選計劃將正確地工作,而無需物理階段隔離,即無需使用假脫機或其他阻塞算子,并且不考慮并發(fā)運行兩階段。雖然有幾個已知的避免萬圣夜問題的方法,但這些方法常常導致資源(諸如存儲空間資源或處理資源)開銷的顯著增長。在此要求保護的主題不限于解決任何缺點或僅在諸如上述環(huán)境中操作的各個實施例。相反,提供該背景僅用以示出在其中可實踐在此描述的部分實施例的一個示例性技術領域。
發(fā)明內容
此處示出的一個示例涉及在計算環(huán)境中實施的方法。該方法包括用于緩解與萬圣夜問題相關的問題的動作,萬圣夜問題包括更新操作潛在地允許在操作期間多于一次地訪問記錄。方法包括訪問數據存儲操作語句的實例。執(zhí)行數據存儲操作語句的實例。對語句的執(zhí)行導致對數據存儲記錄的老版本的更新或刪除或數據存儲記錄的創(chuàng)建。更新數據存儲記錄或創(chuàng)建數據存儲記錄得到數據存儲記錄的新版本。刪除數據存儲記錄導致數據存儲記錄的已刪除版本。數據存儲操作語句的實例與新版本的數據存儲記錄或已刪除版本的數據存儲記錄相關聯(lián)。提供本發(fā)明內容以便以簡化形式介紹在以下具體實施方式
中進一步描述的一些概念。本發(fā)明內容并非旨在標識所要求保護的主題的關鍵特征或必要特征,也不旨在用于幫助確定所要求保護的主題的范圍。另外的特征和優(yōu)點將在以下的描述中闡述,并且部分可從該描述中顯而易見,或者可以從此處的教示實踐中習得。本發(fā)明的各特征和優(yōu)點可以通過在所附的權利要求書中特別指出的手段和組合來實現(xiàn)和獲得。本發(fā)明的特征將從以下描述和所附權利要求書中變得完全顯而易見,或者可通過如下所述對本發(fā)明的實踐而獲知。
為了描述可獲得本主題的上述和其它優(yōu)點和特征的方式,將通過參考附圖中示出的本主題的具體實施方式
來呈現(xiàn)以上簡要描述的本主題的更具體描述。應該理解,這些附圖僅描繪了各典型實施例,因此其不應被認為是對范圍的限制,各實施例將通過使用附圖用附加特征和細節(jié)來描述并解釋,在附圖中圖1示出了示例數據庫系統(tǒng);以及圖2示出了用于緩解與萬圣夜問題相關的問題的方法。
具體實施例方式在計算應用中,語句被用來對數據庫中的記錄進行操作。例如,語句可以被用來創(chuàng)建、讀取、更新,或刪除數據庫記錄。各實施例可實現(xiàn)這樣的功能,藉此用來創(chuàng)建、更新,或刪除記錄的語句與已經由該語句所創(chuàng)建、更新,或刪除的記錄相關聯(lián)。例如,一些實施例可使用每一語句(per-statement)的版本信息(例如,在數據記錄格式中或在記錄頭部中)來區(qū)分由當前語句所創(chuàng)建(或插入)或刪除的記錄和由相同或不同事務中的先前語句所創(chuàng)建或刪除的記錄。該版本信息可被用來隱藏已創(chuàng)建記錄或示出由當前語句刪除的記錄。此外,這可被用來允許實施例向當前語句示出在語句(或在一些實施例中,事務)開始執(zhí)行時存在的數據庫的視圖。在一些實施例中,這創(chuàng)建了階段隔離的邏輯效果并允許更大的算子并發(fā)性,而不必需要物理階段隔離或假脫機算子?,F(xiàn)在參考圖1,示出了一個示例。圖1示出了系統(tǒng)100。系統(tǒng)100內是數據庫102。 數據庫102包括數據庫表格104。數據庫表格104包括用于存儲數據記錄的各個行和列。 在所示示例中,記錄實現(xiàn)為數據庫表格104中的行。圖1還示出了處理器106。處理器106 連接到計算機可讀存儲器108。計算機可讀存儲器108存儲包括計算機可執(zhí)行指令的各種模塊,當由處理器106或一個或多個其他處理器執(zhí)行時,這些計算機可執(zhí)行指令執(zhí)行各種動作。在由圖1所示的示例中,示出了模塊110。模塊110包括事務112。事務是一組語句, 定義在原子上必須全部成功或全部失敗的功能。例如,考慮簡單財務事務。在所示出的簡單示例中,對一個賬號作出借(debit)而對另一賬號作出貸(credit)。事務性地,借或貸的任一方都不可能在沒有另一方的情況下發(fā)生而不會導致數據不一致性。因此,事務可包括導致借被執(zhí)行的語句以及導致貸被執(zhí)行的語句。如果借和貸兩者都執(zhí)行了,則借和貸的影響是持久的,有時被稱為提交事務。如果借或貸的一方失敗,則事務退出,并且所有的中間功能都回退到事務開始之前存在的狀態(tài)。在圖1所示的示例中,事務112包括鎖(lock)之內的三個語句。所示的鎖并不是必要的,但是可用于一些實施例中。事務112中的語句可被用來操作數據庫表格104中的記錄。此處描述的一些實施例,通過用每一語句的版本號來擴充版本存儲,以區(qū)分由當前語句創(chuàng)建的記錄和由更早的語句創(chuàng)建的記錄,可實現(xiàn)解決萬圣夜問題的功能。具體地,一些實施例可向事務112中的每個語句分派一標識符。當語句對數據庫表格104中的記錄執(zhí)行某些功能時,分派給執(zhí)行這些功能的語句的標識符可與對其執(zhí)行功能的記錄相關聯(lián)。例如,在一些實施例中,額外信息與數據庫表格104中所創(chuàng)建的每個新記錄以及數據庫表格中可由事務112內的語句刪除的每個現(xiàn)存記錄一起存儲。在圖1所示的示例中, 語句標識符列114被包括在數據庫表格104中。語句標識符列114包括從事務112中標識出創(chuàng)建了相應行的語句的標識符。在所示出的示例中,標識符1對應于語句1,標識符2對應于語句2,且標識符3對應于語句3。在所示出的示例中,標識符被示為包括在記錄的列元素中,可以理解,可替換地或另外地使用存儲和關聯(lián)標識符的其他方法。例如,在一些實施例中,標識符可被存儲在記錄頭部??商鎿Q地或另外地,可實現(xiàn)各實施例,籍此通過為語句創(chuàng)建語句表格來將記錄關聯(lián)到語句,其中,由語句創(chuàng)建的記錄存儲在該語句表格中。以下將示出各種示例。存儲額外信息允許在讀取一組記錄時作出對于哪些記錄是當前語句所創(chuàng)建而哪些是在語句開始執(zhí)行之前已存在的判定。實施例可通過依靠不立刻刪除或銷毀老版本記錄而是創(chuàng)建并插入新版本以取代老版本的刪除和更新,來利用多版本化 (multi-versioning)。因此,在更新之后,已更新記錄的老版本和新版本兩者同時存在于數據庫表格104中,并且創(chuàng)建新版本的語句仍可讀取老版本,但不能讀取該語句自身所創(chuàng)建的新版本。具體地,額外信息可用來確保數據修改語句僅僅看見如該語句開始執(zhí)行之前已存在的數據庫狀態(tài),并避免該語句看見其自身的修改。一些實施例可導致對于所有包括插入、 更新(修改),和刪除語句的數據修改語句而言這些情況為真。實施例可如此實現(xiàn),其中由于數據修改語句從未看見它們自己的改變,不需要采用其他現(xiàn)有的萬圣夜保護機制,諸如通過插入諸如假脫機或排序的阻塞算子進行的顯式階段隔離,顯式階段隔離在產生任何輸出記錄之前復制所有輸入記錄。排除其他萬圣夜保護機制可減少編譯時間和復雜性,降低萬圣夜保護分析不正確或萬圣夜保護被不正確的應用的錯誤風險,并可通過消除不必要且昂貴的萬圣夜保護假脫機來改善執(zhí)行時間。實施例可被應用于多版本數據庫系統(tǒng),包括SQL服務器的快照隔離。實施例可被應用于基于盤的系統(tǒng)和/或主存儲器系統(tǒng),以及應用于使用悲觀(即,基于鎖)或樂觀(即, 基于確認)并發(fā)性控制方案的系統(tǒng)。有各種實現(xiàn)選擇,用于將數據存儲操作語句與數據存儲記錄版本關聯(lián)。以下將討論若干這些問題。例如,一個實施例可向事務112內的每個語句分派唯一版本號。在一些實施例中,這些號可被生成為單調遞增的整數。圖1所示的示例正示出了這樣的示例??商鎿Q地或另外地,可使用分派到語句的時戳,諸如,當語句首次對記錄執(zhí)行某一功能時的時戳指示。示出這些示例性實施例后,可以理解可采用許多不同數量的方案中的任何一個。例如,在一些實施例中,可使用生成語句的唯一號碼的任何方案,無論全局地或是事務內的。如前述,當一語句的版本號被存儲在那條語句所創(chuàng)建的每個記錄中時,可實現(xiàn)各實施例??蓪崿F(xiàn)實施例,其中在讀取的時候,那條語句僅被允許看見不包含當前版本號 (即,對應于那條記錄的版本號)的記錄。例如,在圖1中,事務112中的語句3可讀取語句標識符列114中帶有標識符1和2的記錄,但是不能讀取語句標識符列中帶有標識符3的記錄。如果每個事務還具有其自己的事務標識符(這在多版本系統(tǒng)中很普遍),并且如果事務標識符與由事務創(chuàng)建的任何記錄一起存儲,則語句版本號可由不同事務中的語句重新使用。因此,例如,4字節(jié)的版本號可允許每事務含多達232 (約4百萬)條語句,并應該足以允許任何合理事務完成。在替換實施例中,即使當事務標識符沒有與由事務創(chuàng)建的任何記錄一起存儲時,版本號可仍然是事務上下文專用。在這些實施例中,事務提交過程的部分可包括從記錄中清除版本號。可實現(xiàn)實施例以使用更少字節(jié)來存儲版本號。然而,如果實現(xiàn)使用過于少的字節(jié), 則該實現(xiàn)可能在事務完成之前用完語句標識符。如果發(fā)生這種情況,可實施各種替換。例如,各實施例可中止當前事務。在這樣的實施例中,不可能使用本發(fā)明的該實現(xiàn)完成全部事務。因此需要執(zhí)行替換的數據處理方法。在替換的實施例中,實施例可以開始重新使用版本號。在版本號可以被重新使用之前,先前由該事務創(chuàng)建的全部記錄使它們的當前版本號被重置為“安全”版本號。例如,一實施例可將全部版本號重置為零并接著從1開始分派新版本號。需要重置的記錄的列表可以通過維持由當前事務更新的記錄列表來高效地標識。 這可以通過使用現(xiàn)存數據庫功能來完成。例如,許多數據庫系統(tǒng)已經維持由當前事務為事務日志更新的記錄列表。如果版本號需要重置多于一次,它能夠回想起上一次重置離開的地方并能夠僅訪問每個記錄一次(并重置版本號)。使用小版本號的特殊示例包含在使用單個位(bit)來指示哪些記錄是由當前語句所創(chuàng)建的實現(xiàn)中。例如,值零可意味著記錄先前被創(chuàng)建,而值1可意味著記錄由當前語句創(chuàng)建。該位可如上所述在每條語句之后或開始執(zhí)行新語句之前被重置。在該范圍的另一頭,實現(xiàn)可向事務和語句分派來自單個唯一標識符空間的標識符。此方案將潛在地允許使用更大標識符。在上述示例中,語句標識符與記錄一起存儲。然而,替換實施例可被實現(xiàn),其中事務存儲由當前語句所創(chuàng)建或刪除的記錄列表。在一些實施例中,該列表可被存儲在諸如散列表格的數據結構中,使得搜索高效。單個列表可被用于已創(chuàng)建或刪除的記錄。然而,被插入和被刪除的記錄兩者都被添加到該列表。然而,存在于列表中具有不同的效果,這取決于記錄是被插入的還是被刪除的。例如,如果在列表中記錄被標識為被插入的結果,那么阻止語句讀取該記錄。如果在列表中記錄被標識為刪除的結果,那么仍然允許語句看見該記錄。 列表中可包括指示符以指示記錄在列表中是被插入的結果還是被刪除的結果。可替換地或另外地,記錄本身具有某種指示符以指示記錄是否是被刪除的記錄??商鎿Q地或另外地,存在于列表中簡單地倒轉記錄的默認可見性。這個列表在每條語句完成后可被丟棄。在讀取時,如果語句遇到由當前事務創(chuàng)建的記錄,則該語句檢查與當前事務相關聯(lián)的記錄列表,以確定該記錄由當前語句所創(chuàng)建且應該被跳過,還是該記錄是以前存在且應該可見;或者,在已刪除語句的情況中,確定記錄由當前語句創(chuàng)建且應該可見,還是該記錄是先前被刪除且應該被跳過。將語句版本號與每個記錄一起存儲對于主存儲器系統(tǒng)而言特別適合,其中返回到記錄以重置版本號的開銷限于在存儲器寫入。如果包含需要版本號重置的記錄的頁已經被清除到盤中和/或被逐出存儲器,基于盤的系統(tǒng)可能需要執(zhí)行額外的盤寫入或甚至額外的盤讀取。因此,基于盤的系統(tǒng)可從上述包含存儲記錄的單獨列表的實施例中受益。語句版本號可以與已插入記錄和已刪除記錄兩者相關聯(lián),前者使得向當前語句隱藏它們,后者使得繼續(xù)向當前語句示出它們。在不允許事務刪除由尚未提交的不同事務所
8創(chuàng)建的記錄的系統(tǒng)中,使用相同的存儲器足以存儲創(chuàng)建該記錄的語句的版本號以及后來刪除該記錄的語句的版本號??蓪崿F(xiàn)各實施例,其中創(chuàng)建記錄的事務不需要已經提交,但是已經完成其活動處理。例如,事務可在“提交前”或“確認”階段。需要這兩語句不能并發(fā)地執(zhí)行。類似地,如果語句試圖刪除由較早的語句在相同事務中創(chuàng)建的記錄,則只要這兩個語句不能并發(fā)地執(zhí)行,第二語句就能覆蓋第一語句的版本號。一實施例實現(xiàn)可選擇通過僅向具有潛在萬圣夜保護需求的語句分派版本號來節(jié)省版本號。這可以通過,例如,減少存儲號所需要的字節(jié)數來做到。例如,在一簡單實施例中,僅僅那些修改數據的語句需要版本號。更為復雜的實現(xiàn)也可僅向那些從相同表格中讀取和寫入的語句或者讀取和寫入可能潛在地沖突的語句分派版本號。例如,如果語句已經包含在讀取和寫入之間的阻塞算子(例如,排序),則無需向該語句分派新版本號,因為該語句將無論如何都不能讀取它創(chuàng)建的記錄。如果使用單個位來跟蹤哪些記錄是由當前語句創(chuàng)建的,或如果事務存儲由當前語句創(chuàng)建的記錄列表,則該優(yōu)化特別有用??蓪崿F(xiàn)實施例,其中版本號被壓縮。例如,可基于事務大小分配用于版本號的位數或字節(jié)數。例如,通過調整可用于版本號的位數或字節(jié)數,執(zhí)行更少語句并生成相對少的版本號的事務可使用較少的用于這些版本號的存儲。例如,執(zhí)行127條或更少語句的事務將需要最多一個字節(jié)的存儲來存儲這些版本號。一些實施例可具有各種施加的限制。例如,可實現(xiàn)實施例,其中語句不能刪除它插入的記錄。這可以通過,如上述,設計來實現(xiàn),其中語句不能讀取它插入的記錄并且它不能刪除它不能讀取的記錄??蓪崿F(xiàn)實施例,其中一個事務中的語句不能刪除由第二事務中的并發(fā)語句所插入的記錄,直到并發(fā)語句完成且第二事務提交為止。值得注意的,可實現(xiàn)一些實施例,其中第二事務僅需要開始提交的進程,因為無論采取何種方式并發(fā)語句必須完成。每個記錄一個語句id足以跟蹤插入的記錄和刪除的記錄兩者。如果語句試圖讀取由該語句插入的記錄,則由于該版本標識符,該語句將被阻止讀取該記錄。如果語句試圖讀取由該語句刪除的記錄,則由于該版本標識符,該語句將被允許讀取該記錄。因此,語句將被允許讀取并非由它插入的已插入的(還未刪除的)記錄,但是將不被允許讀取由它插入的已插入的(還未刪除的)的記錄。同樣,語句將被允許讀取它刪除的已刪除記錄,但是將不能讀取并非由它刪除的已刪除記錄。考慮以下事件序列,注意到記錄存儲3個值,即 開始事務、結束事務,和語句id。1.事務Tl開始。2. Tl中的語句Sl開始。3. Sl 插入記錄 Rl (Tl,_,Si)。4. Sl試圖讀取R1,并且因為Sl創(chuàng)建了 Rl而跳過R1。5. Tl中的語句S2開始。6. S2讀取記錄Rl,并且因為S2沒有創(chuàng)建過Rl而成功讀取記錄Rl。7. S2 刪除記錄 R1(T1,T1,S2)。8. S2讀取記錄R1,并且因為S2刪除了 Rl而成功讀取記錄R1。9. Tl中的語句S3開始。10. S3試圖讀取記錄R1,并因為S3沒有刪除過Rl而跳過R1。
值得注意的是,作為所存儲的語句標識符匹配當前語句的結果,步驟4和8與步驟 6和10產生相反結果。這表明了語句創(chuàng)建記錄時采取的動作和語句刪除記錄時采取的動作之間的區(qū)別。一些實施例將進一步包括用于在先前時間確定系統(tǒng)狀態(tài)的功能。例如,使用版本號,實施例可在對各記錄運行特定語句之前確定數據庫的狀態(tài),以查看作為對記錄運行語句的結果的系統(tǒng)狀態(tài),等。例如,在一些實施例中,系統(tǒng)在特定時間或在執(zhí)行特定語句之后的狀態(tài)可通過使用與特定時間或特定語句相關聯(lián)的版本號來確定,并且全部版本號與較早時間和/或較早語句相關聯(lián)。例如,如果用戶想要觀察作為執(zhí)行特定語句的結果的系統(tǒng)狀態(tài),關聯(lián)于與語句相關聯(lián)的版本號的任何記錄以及關聯(lián)于與先前執(zhí)行的語句相關聯(lián)的版本號的任何記錄可被用來向用戶呈現(xiàn)系統(tǒng)的先前狀態(tài)。以下討論現(xiàn)涉及可以執(zhí)行的多種方法以及方法動作。雖然用特定次序討論或用以特定次序發(fā)生的流程圖示出了各個方法動作,但除非明確規(guī)定否則不需要特定次序,或因為一動作依賴于另一動作在執(zhí)行該動作之前完成而需要特定次序?,F(xiàn)在參考圖2,示出了方法200。該方法可在計算環(huán)境中實踐,并包括用于緩解與萬圣夜問題相關的問題的動作,萬圣夜問題包括更新操作潛在地允許在操作期間多于一次地訪問記錄。方法200包括訪問數據存儲操作語句的實例(動作20幻。方法200還包括執(zhí)行數據存儲操作語句的實例。這導致對數據存儲記錄的老版本的更新或刪除或數據存儲記錄的創(chuàng)建。在對數據存儲記錄的更新或創(chuàng)建的情況中,創(chuàng)建數據存儲記錄的新版本。數據存儲記錄的已刪除版本招致語句導致數據存儲中的刪除的情況(動作204)。方法200還包括將數據存儲操作語句的實例與數據存儲記錄的新版本或數據存儲記錄的已刪除版本相關聯(lián)(動作206)。示例性地,方法200可被執(zhí)行,其中將數據存儲操作的實例與數據存儲記錄的新版本或數據存儲記錄的已刪除版本相關聯(lián)包括將與數據存儲操作語句的實例相關聯(lián)的一個或多個標識符存儲在數據存儲記錄的新版本中。各種實施例和替換可實現(xiàn)此功能。例如, 在一些實施例中,將與數據存儲操作語句的實例相關聯(lián)的一個或多個標識符存儲在數據存儲記錄的新版本中或數據存儲記錄的已刪除版本中可包括僅將某一唯一標識符存儲在數據存儲記錄中。例如,標識符可以是全局唯一標識符。在替換實施例中,將與數據存儲操作語句的實例相關聯(lián)的一個或多個標識符存儲在數據存儲記錄的新版本中或數據存儲記錄的已刪除版本中可包括存儲語句的事務性的唯一標識符。例如,包括數據存儲操作語句的實例的事務的標識符,以及事務內數據存儲操作語句的實例的標識符,可被存儲在數據存儲記錄中??蓪崿F(xiàn)實施例,其中將與數據存儲操作語句的實例相關聯(lián)的一個或多個標識符存儲在數據存儲記錄的新版本中或數據存儲記錄的已刪除版本中可包括將一個或多個標識符存儲在用戶可訪問的數據存儲記錄的新版本中的列中。例如,圖1示出標識符存儲在標識符列114中的哪里。在可替換實施例中,可實現(xiàn)實施例,其中將與數據存儲操作語句的實例相關聯(lián)的一個或多個標識符存儲在數據存儲記錄的新版本中或數據存儲記錄的已刪除版本中可包括將一個或多個標識符存儲在數據存儲記錄的新版本中的記錄頭部中。在一些實施例中,數據存儲記錄的新版本或數據存儲記錄的已刪除版本中與數據存儲操作語句的實例相關聯(lián)的一個或多個標識符包括版本號。在這些實施例的一些中,方法還包括一旦全部可用版本號已被使用,將與數據存儲操作語句相關的全部版本號重置為安全版本號,并重新使用版本號。例如,一實施例可將全部版本號重置為零并接著從1開始分配新版本號??蓪崿F(xiàn)實施例,包括壓縮數據存儲記錄的新版本中與數據存儲操作語句的實例相關聯(lián)的一個或多個標識符的一個或多個。例如,可基于事務大小分配版本號的位數或字節(jié)數。例如,通過調整可版本號的位數或字節(jié)數,執(zhí)行較少語句并生成相對少的版本號的事務可使用較少的用于這些版本號的存儲。例如,執(zhí)行127條或更少語句的事務將需要最多一個字節(jié)的存儲來存儲這些版本號??蓪嵤┓椒?00的實例,其中將數據存儲操作語句的實例與數據存儲記錄的新版本或數據存儲記錄的已刪除版本相關聯(lián)可包括在數據存儲記錄的新版本或數據存儲記錄的已刪除版本中設置單個位來指示數據存儲記錄的新版本或數據存儲記錄的已刪除版本作為執(zhí)行數據存儲操作語句的實例的結果而被創(chuàng)建。因此,使用小版本號的特殊示例在使用單個位指示哪些記錄由當前語句所創(chuàng)建的實現(xiàn)中得到具體化。例如,值零可意味著記錄先前被創(chuàng)建,而值1可意味著記錄由當前語句創(chuàng)建,反之亦然。該位可如上所述在每條語句之后或開始執(zhí)行新語句之前被重置。因此,實施例還可包括在數據存儲操作語句已經完成執(zhí)行后清除該單個位??蓪嵤┓椒?00的實施例,其中將數據存儲操作語句的實例與數據存儲記錄的新版本或數據存儲記錄的已刪除版本相關聯(lián)可包括將數據存儲記錄的新版本或數據存儲記錄的已刪除版本存儲在與當前事務相關聯(lián)的列表中,當前事務包括由當前事務的上下文內的數據存儲操作語句的實例所創(chuàng)建的記錄。在上述其它示例中,語句標識符與記錄一起存儲。然而,一些替換實施例可被實現(xiàn),其中事務存儲由當前語句所創(chuàng)建或刪除的記錄列表。 在一些實施例中,該列表可被存儲在諸如散列表格的數據結構中,使得搜索高效。單個表格可被用于已創(chuàng)建或刪除的記錄。然而,被插入和被刪除的記錄兩者都被添加到列表。然而, 存在于該列表中具有不同的效果,這取決于記錄是被插入還是被刪除。具體地,存在于列表中可能導致默認可見性的倒轉。例如,如果在列表中記錄是被插入的結果,那么阻止語句讀取該記錄。如果在列表中記錄被標識為刪除,那么仍然允許語句看見該記錄。這個列表在每條語句完成后可被丟棄。在讀取時,如果語句遇到由當前事務創(chuàng)建的記錄,則它檢查與當前事務相關聯(lián)的記錄列表,以確定該記錄由當前語句所創(chuàng)建且應該被跳過,還是該記錄以前已存在且應該是可見的。因此,可實現(xiàn)實施例,其中方法還包括在數據存儲操作語句已經完成執(zhí)行之后丟棄該表。包括使用該表一些實施例可包括當執(zhí)行讀取操作時,確定試圖讀取的記錄是由當前事務創(chuàng)建的。作為結果,該方法還包括檢查與當前事務相關聯(lián)的記錄列表,以確定記錄由數據存儲操作語句的實例所創(chuàng)建并且應該是不可讀的,還是記錄先前已存在并且應該是可讀的。這方便了該示例,其中記錄是由當前語句插入并且因此應該是不可讀的,或者記錄是由不同語句插入并且因此應該是可讀的。包括使用該表一些實施例可包括,當執(zhí)行讀取操作時,確定試圖讀取的記錄是由當前事務創(chuàng)建的,并且作為結果,檢查與當前事務相關聯(lián)的記錄列表,以確定記錄由數據存儲操作語句的示例刪除且應該可讀,還是記錄先前已存在并且應該不可讀。這方便了該示例,其中記錄是由當前語句刪除并且因此應該是可讀的,或者記錄是由不同語句刪除并且因此應該是不可讀的。方法200可進一步包括相同的數據存儲操作語句試圖讀取數據存儲記錄的新版本。作為將數據存儲操作語句的實例與數據存儲記錄的新版本關聯(lián)的結果,方法200包括阻止數據存儲操作語句讀取數據存儲記錄的新版本。因此,在此示例中,語句將不能讀取它所創(chuàng)建的記錄。方法200可進一步包括相同的數據存儲操作語句試圖讀取數據存儲記錄的已刪除版本。作為將數據存儲操作語句的實例與數據存儲記錄的已刪除版本關聯(lián)的結果,方法 200包括阻止允許數據存儲操作語句讀取數據存儲記錄的已刪除版本。因此,在此示例中, 語句將能讀取它所刪除的記錄。方法200可進一步包括不同的數據存儲操作語句試圖讀取數據存儲記錄的新版本。作為將數據存儲操作語句的實例與數據存儲記錄的新版本關聯(lián)的結果,不同的數據存儲操作語句被允許讀取數據存儲記錄的新版本。方法200可進一步包括不同的數據存儲操作語句試圖讀取數據存儲記錄的已刪除版本。作為將數據存儲操作語句的實例與數據存儲記錄的已刪除版本關聯(lián)的結果,不同的數據存儲操作語句被阻止讀取數據存儲記錄的已刪除版本。此外,該方法可以由包括一個或多個處理器和諸如計算機存儲器等計算機可讀介質的計算機系統(tǒng)來實施。具體而言,計算機存儲器可以存儲計算機可執(zhí)行指令,計算機可執(zhí)行指令在由一個或多個處理器執(zhí)行時使得執(zhí)行各種功能,如在各實施方式中所述的那些動作。本發(fā)明的各實施例可以包括或利用含有計算機硬件的專用或通用計算機,這將在以下做出進一步討論。本發(fā)明范圍內的各實施例還包括用于攜帶或存儲計算機可執(zhí)行指令和/或數據結構的物理介質和其他計算機可讀介質。這些計算機可讀介質可以是通用或專用計算機系統(tǒng)能夠訪問的任何可用介質。存儲計算機可執(zhí)行指令的計算機可讀介質是物理存儲介質。攜帶計算機可執(zhí)行指令的計算機可讀介質是傳輸介質。由此,作為示例而非限制,本發(fā)明的各實施例可包括至少兩種完全不同類型的計算機可讀介質物理計算機可讀存儲介質和傳輸計算機可讀介質。 物理計算機存儲介質包括RAM、ROM、EEPROM、CD-ROM或其他光盤存儲(如CD、DVD
等)、磁盤存儲或其他磁存儲設備、或可用于存儲計算機可執(zhí)行指令或數據結構形式的所需程序代碼裝置且可由通用或專用計算機訪問的任何其他介質?!熬W絡”被定義為允許在計算機系統(tǒng)和/或模塊和/或其他電子設備之間傳輸電子數據的一個或多個數據鏈路。當信息通過網絡或另一個通信連接(硬連線、無線、或者硬連線或無線的組合)傳輸或提供給計算機時,該計算機將該連接適當地視為傳輸介質。傳輸介質可包括可用于攜帶計算機可執(zhí)行指令或數據結構形式的所需程序代碼裝置且可由通用或專用計算機訪問的網絡和/或數據鏈路。以上介質的組合也被包括在計算機可讀介質的范圍內。此外,在到達各種計算機系統(tǒng)組件時,以計算機可執(zhí)行的指令或數據結構的形式存在的程序代碼裝置可以自動地從傳輸計算機可讀介質傳輸到物理計算機可讀存儲介質 (或者反之亦然)。例如,通過網絡或數據鏈路接收到的計算機可執(zhí)行指令或數據結構可被緩存在網絡接口模塊(例如,“NIC”)內的RAM中,然后最終被傳送到計算機系統(tǒng)RAM和/或計算機系統(tǒng)處的較不易失性的計算機可讀物理存儲介質。因此,計算機可讀物理存儲介質可被包括在同樣(或甚至主要)利用傳輸介質的計算機系統(tǒng)組件中。計算機可執(zhí)行指令包括,例如使通用計算機、專用計算機、或專用處理設備執(zhí)行某一功能或某組功能的指令和數據。計算機可執(zhí)行指令可以是例如二進制代碼、諸如匯編語言之類的中間格式指令、或甚至源代碼。盡管用結構特征和/或方法動作專用的語言描述了本主題,但可以理解,所附權利要求書中定義的主題不必限于上述特征或動作。相反,上述特征和動作是作為實現(xiàn)權利要求的示例形式而公開的。本領域的技術人員將理解,本發(fā)明可以在具有許多類型的計算機系統(tǒng)配置的網絡計算環(huán)境中實踐,這些計算機系統(tǒng)配置包括個人計算機、臺式計算機、膝上型計算機、消息處理器、手持式設備、多處理器系統(tǒng)、基于微處理器的或可編程消費電子設備、網絡PC、小型計算機、大型計算機、移動電話、PDA、尋呼機、路由器、交換機等等。本發(fā)明也可在其中通過網絡鏈接(或者通過硬連線數據鏈路、無線數據鏈路,或者通過硬連線和無線數據鏈路的組合)的本地和遠程計算機系統(tǒng)兩者都執(zhí)行任務的分布式系統(tǒng)環(huán)境中實施。在分布式系統(tǒng)環(huán)境中,程序模塊可位于本地和遠程存儲器存儲設備中。本發(fā)明可具體化為其他具體形式而不背離其精神或特征。所描述的實施例在所有方面都應被認為僅是說明性而非限制性的。因此,本發(fā)明的范圍由所附權利要求書而非前述描述指示。落入權利要求書的等效方案的含義和范圍內的所有改變被權利要求書的范圍所涵蓋。
權利要求
1.一種在計算環(huán)境中緩解與萬圣夜問題相關的問題的方法,所示萬圣夜問題包括其中更新操作潛在地允許在操作期間多于一次地訪問記錄,所述方法包括訪問數據存儲操作語句的實例(202);執(zhí)行所述數據存儲操作語句的所述實例導致對數據存儲記錄的老版本的更新或刪除, 或對數據存儲記錄的創(chuàng)建,在對數據存儲記錄的更新或創(chuàng)建情況中得到所述數據存儲記錄的新版本,或在數據存儲中的刪除情況中得到所述數據存儲記錄的已刪除版本O04);以及將所述數據存儲操作語句的所述實例與所述數據存儲記錄的所述新版本或所述數據存儲記錄的所述已刪除版本相關聯(lián)006)。
2.如權利要求1所述的方法,其特征在于,將所述數據存儲操作的所述實例與所述數據存儲記錄的所述新版本或所述數據存儲記錄的所述已刪除版本相關聯(lián)包括將與所述數據存儲操作語句的所述實例相關聯(lián)的一個或多個標識符存儲在所述數據存儲記錄的所述新版本中。
3.如權利要求2所述的方法,其特征在于,將與所述數據存儲操作語句的實例相關聯(lián)的一個或多個標識符存儲在所述數據存儲記錄的新版本或所述數據存儲記錄的已刪除版本中包括存儲事務的標識符,所述事務包括所述數據存儲操作語句的所述實例;以及存儲在所述事務內的所述數據存儲操作語句的所述實例的標識符。
4.如權利要求2所述的方法,其特征在于,將與所述數據存儲操作語句的所述實例相關聯(lián)的一個或多個標識符存儲在所述數據存儲記錄的所述新版本中或所述數據存儲記錄的所述已刪除版本中包括存儲所述數據存儲操作語句的全局標識符。
5.如權利要求2所述的方法,其特征在于,將與所述數據存儲操作語句的所述實例相關聯(lián)的一個或多個標識符存儲在所述數據存儲記錄的所述新版本中或所述數據存儲記錄的所述已刪除版本中包括將一個或多個標識符存儲在所述數據存儲記錄的所述新版本的記錄頭部中。
6.如權利要求2所述的方法,其特征在于,將與所述數據存儲操作語句的所述實例相關聯(lián)的一個或多個標識符存儲在所述數據存儲記錄的所述新版本中或所述數據存儲記錄的所述已刪除版本中包括將一個或多個標識符存儲在所述數據存儲記錄的所述新版本中的用戶能夠訪問的列中。
7.如權利要求2所述的方法,其特征在于,所述數據存儲記錄的所述新版本中或所述數據存儲記錄的所述已刪除版本中與所述數據存儲操作語句的所述實例相關聯(lián)的一個或多個標識符包括版本號,所述方法還包括一旦全部能用的版本號已被使用,將與數據存儲操作語句相關的全部版本號重置為安全版本號,并重新使用各版本號。
8.如權利要求2所述的方法,其特征在于,還包括壓縮所述數據存儲記錄的所述新版本或所述數據存儲記錄的所述已刪除版本中與數據存儲操作語句的實例相關聯(lián)的一個或多個標識符中的一個或多個。
9.如權利要求1所述的方法,其特征在于,將所述數據存儲操作語句的所述實例與所述數據存儲記錄的所述新版本或所述數據存儲記錄的所述已刪除版本相關聯(lián)包括在所述數據存儲記錄的所述新版本或所述數據存儲記錄的所述已刪除版本中設置單個位,來指示所述數據存儲記錄的所述新版本或所述數據存儲記錄的所述已刪除版本作為執(zhí)行所述數據存儲操作語句的所述實例的結果而被創(chuàng)建。
10.如權利要求9所述的方法,其特征在于,還可包括在所述數據存儲操作語句已經完成執(zhí)行后清除所述單個位。
11.如權利要求1所述的方法,其特征在于,將所述數據存儲操作語句的所述實例與所述數據存儲記錄的所述新版本或所述數據存儲記錄的所述已刪除版本相關聯(lián)可包括將所述數據存儲記錄的所述新版本或所述數據存儲記錄的所述已刪除版本存儲在與當前事務相關聯(lián)的列表中,所述當前事務包括在所述當前事務的上下文內的由所述數據存儲操作語句的所述實例所創(chuàng)建的記錄。
12.如權利要求11所述的方法,其特征在于,還可包括在所述數據存儲操作語句已經完成執(zhí)行后丟棄所述列表。
13.如權利要求11所述的方法,其特征在于,還包括當執(zhí)行讀取操作時,檢查與所述當前事務相關聯(lián)的記錄列表,以確定所述記錄由所述數據存儲操作語句的所述實例創(chuàng)建并且應該是不可讀的,還是所述記錄先前已存在并且應該是可讀的。
14.如權利要求11所述的方法,其特征在于,還包括當執(zhí)行讀取操作時,檢查與所述當前事務相關聯(lián)的記錄列表,以確定所述記錄由所述數據存儲操作語句的所述實例刪除并且應該是可讀的,還是所述記錄先前已存在并且應該是不可讀的。
15.如權利要求1所述的方法,其特征在于,還包括相同的數據存儲操作語句試圖讀取所述數據存儲記錄的所述新版本,并且作為所述數據存儲操作語句的所述實例與所述數據存儲記錄的所述新版本相關聯(lián)的結果,阻止所述數據存儲操作語句讀取所述數據存儲記錄的所述新版本。
全文摘要
本發(fā)明涉及在多版本數據庫系統(tǒng)中的萬圣夜保護。緩解與萬圣夜問題相關的問題的動作,萬圣夜問題包括更新操作潛在地允許在操作期間多于一次地訪問記錄。方法包括訪問數據存儲操作語句的實例。執(zhí)行數據存儲操作語句的實例導致對數據存儲記錄的老版本的更新或刪除或對數據存儲記錄的創(chuàng)建,在數據存儲記錄的更新或創(chuàng)建情況中得到數據存儲記錄的新版本,并在數據存儲中的刪除情況中得到數據存儲記錄的已刪除版本。數據存儲操作語句的實例與數據存儲記錄的新版本或數據存儲記錄的已刪除版本相關聯(lián)。
文檔編號G06F17/30GK102567453SQ20111035846
公開日2012年7月11日 申請日期2011年10月31日 優(yōu)先權日2010年10月29日
發(fā)明者C·J·坎寧安, C·S·弗里德曼 申請人:微軟公司