本公開概括而言涉及信息的復(fù)制。特定實(shí)現(xiàn)方式涉及數(shù)據(jù)庫環(huán)境中的源和副本之間的數(shù)據(jù)的復(fù)制。
背景技術(shù):
::通過創(chuàng)建源表格的副本(replica)可增強(qiáng)數(shù)據(jù)庫性能。例如,復(fù)制的表格可被容宿(hosted)在與源表格不同的計算系統(tǒng)上,其中源主機(jī)和副本主機(jī)具有不同的處理器。讓副本可用于服務(wù)于數(shù)據(jù)庫讀取請求可幫助在多個處理器之間平衡計算負(fù)載,改善系統(tǒng)性能。在一些情況中,副本也可用于“高可用性數(shù)據(jù)”目的,例如當(dāng)在源表格變得不可用的情況下副本能夠接管源表格的一個或多個功能時。復(fù)制的系統(tǒng)中的挑戰(zhàn)包括維持源表格和副本表格之間的一致性。如果與復(fù)制相關(guān)聯(lián)的開銷太高,復(fù)制也可導(dǎo)致系統(tǒng)性能降低。例如,在典型的同步復(fù)制協(xié)議中,副本是在與源相同的事務(wù)邊界內(nèi)被更新的。然而,這可導(dǎo)致在源主機(jī)和副本主機(jī)兩者處的事務(wù)可見性延遲,因?yàn)橥綇?fù)制通常涉及容宿源表格的計算系統(tǒng)和容宿副本表格的計算系統(tǒng)之間的多個通信。在一些情況中,通過異步復(fù)制對副本表格的改變可改善性能。然而,完全異步的協(xié)議可向數(shù)據(jù)庫系統(tǒng)添加復(fù)雜性。技術(shù)實(shí)現(xiàn)要素:提供此
發(fā)明內(nèi)容部分來以簡化的形式介紹下文中在具體實(shí)施方式部分進(jìn)一步描述的概念中的選擇的一部分。此
發(fā)明內(nèi)容部分并不打算標(biāo)識要求保護(hù)的主題的關(guān)鍵特征或必要特征,也不打算用來限制要求保護(hù)的主題的范圍。描述了技術(shù)和解決方案用于在數(shù)據(jù)庫環(huán)境內(nèi)執(zhí)行復(fù)制(例如被插入、更新和/或刪除數(shù)據(jù)庫操作所修改的數(shù)據(jù)庫信息的復(fù)制),例如使用數(shù)據(jù)操縱語言(datamanipulationlanguage,dml)語句。數(shù)據(jù)庫環(huán)境包括源節(jié)點(diǎn)和副本節(jié)點(diǎn)。在一個方面中,源節(jié)點(diǎn)在由源節(jié)點(diǎn)存儲的至少一個數(shù)據(jù)庫表格上執(zhí)行數(shù)據(jù)庫操作。源節(jié)點(diǎn)將該數(shù)據(jù)庫操作異步發(fā)送到副本節(jié)點(diǎn)。準(zhǔn)備提交請求被從源節(jié)點(diǎn)同步發(fā)送到副本節(jié)點(diǎn)。源節(jié)點(diǎn)接收來自副本節(jié)點(diǎn)的同步預(yù)提交確認(rèn)。預(yù)提交確認(rèn)指出在副本節(jié)點(diǎn)處執(zhí)行了數(shù)據(jù)庫操作。源節(jié)點(diǎn)提交與該數(shù)據(jù)庫操作相關(guān)聯(lián)的事務(wù)。在一些實(shí)現(xiàn)方式中,在源節(jié)點(diǎn)處提交事務(wù)可在不等待接收來自副本節(jié)點(diǎn)的同步預(yù)提交確認(rèn)的情況下開始(例如寫提交日志)。在另一方面中,在數(shù)據(jù)庫環(huán)境中,副本節(jié)點(diǎn)接收從源節(jié)點(diǎn)異步發(fā)送的數(shù)據(jù)庫操作。副本節(jié)點(diǎn)在由副本節(jié)點(diǎn)存儲的從源節(jié)點(diǎn)處的表格復(fù)制的至少一個數(shù)據(jù)庫表格的拷貝上執(zhí)行該數(shù)據(jù)庫操作。副本節(jié)點(diǎn)從源節(jié)點(diǎn)接收同步通知以準(zhǔn)備提交包括該數(shù)據(jù)庫操作的事務(wù)。副本節(jié)點(diǎn)預(yù)提交該事務(wù)并且向源節(jié)點(diǎn)發(fā)送同步準(zhǔn)備提交確認(rèn)。準(zhǔn)備提交確認(rèn)指出副本節(jié)點(diǎn)預(yù)提交了該事務(wù)。在另外一方面中,在數(shù)據(jù)庫環(huán)境中,源節(jié)點(diǎn)在由源節(jié)點(diǎn)存儲的至少一個數(shù)據(jù)庫表格上執(zhí)行數(shù)據(jù)庫操作。源節(jié)點(diǎn)將該數(shù)據(jù)庫操作發(fā)送到副本節(jié)點(diǎn)。同步準(zhǔn)備提交請求被從源節(jié)點(diǎn)發(fā)送到副本節(jié)點(diǎn)。源節(jié)點(diǎn)接收來自副本節(jié)點(diǎn)的同步準(zhǔn)備提交確認(rèn),該確認(rèn)指出副本節(jié)點(diǎn)預(yù)提交了與該數(shù)據(jù)庫操作相關(guān)聯(lián)的事務(wù)。源節(jié)點(diǎn)提交該事務(wù)。在一些實(shí)現(xiàn)方式中,在源節(jié)點(diǎn)處提交事務(wù)可在不等待接收來自副本節(jié)點(diǎn)的同步準(zhǔn)備提交確認(rèn)的情況下開始(例如寫提交日志)。不等待接收來自副本節(jié)點(diǎn)的提交確認(rèn),源節(jié)點(diǎn)向數(shù)據(jù)庫客戶端發(fā)送提交確認(rèn)。提交確認(rèn)(從源節(jié)點(diǎn)發(fā)送到數(shù)據(jù)庫客戶端)指出源節(jié)點(diǎn)提交了事務(wù)。如本文所述,各種其他特征和優(yōu)點(diǎn)根據(jù)需要可被包含到這些技術(shù)中。附圖說明圖1是利用dml語句和寫入日志傳送支持復(fù)制的環(huán)境的示圖。圖2是描繪用于利用dml語句和寫入日志傳送執(zhí)行數(shù)據(jù)庫表格的復(fù)制的數(shù)據(jù)庫環(huán)境的示圖;圖3是描繪用于從源節(jié)點(diǎn)到副本節(jié)點(diǎn)執(zhí)行數(shù)據(jù)庫表格的復(fù)制的數(shù)據(jù)庫環(huán)境的示圖;圖4是描繪可用于本公開的至少某些實(shí)現(xiàn)方式中的提供版本空間管理的事務(wù)情境的體系結(jié)構(gòu)的示圖。圖5a是圖示出未復(fù)制的數(shù)據(jù)庫系統(tǒng)的示圖。圖5b是描繪從源節(jié)點(diǎn)到副本節(jié)點(diǎn)復(fù)制數(shù)據(jù)庫表可如何提供數(shù)據(jù)庫系統(tǒng)中的負(fù)載平衡的示圖。圖6a是描繪在沒有表格復(fù)制的情況下在分布式數(shù)據(jù)庫系統(tǒng)中可如何執(zhí)行效率低下的跨節(jié)點(diǎn)聯(lián)接操作的示圖。圖6b是圖示出在分布式數(shù)據(jù)庫系統(tǒng)中可如何使用復(fù)制來避免跨節(jié)點(diǎn)聯(lián)接操作的示圖。圖7是數(shù)據(jù)庫事務(wù)中可包括的示例數(shù)據(jù)庫操作的示圖,圖示了后來操作對早前操作的依從性。圖8是描繪用來提交從源節(jié)點(diǎn)復(fù)制到副本節(jié)點(diǎn)的事務(wù)的兩階段提交協(xié)議的示圖。圖9是一種協(xié)議的示圖,在該協(xié)議中用于事務(wù)的數(shù)據(jù)庫操作被從源節(jié)點(diǎn)異步發(fā)送到副本節(jié)點(diǎn),其中在源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間有同步通信來在副本節(jié)點(diǎn)處預(yù)提交該事務(wù)。圖10a是一種用于在數(shù)據(jù)庫環(huán)境內(nèi)從源節(jié)點(diǎn)到副本節(jié)點(diǎn)執(zhí)行復(fù)制的涉及源節(jié)點(diǎn)的示例方法的流程圖,其中事務(wù)的一個或多個數(shù)據(jù)庫操作被異步發(fā)送到副本節(jié)點(diǎn),并且源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間的同步通信被用于在副本節(jié)點(diǎn)處預(yù)提交該事務(wù)。圖10b是一種用于在數(shù)據(jù)庫環(huán)境內(nèi)從源節(jié)點(diǎn)到副本節(jié)點(diǎn)執(zhí)行復(fù)制的涉及副本節(jié)點(diǎn)的示例方法的流程圖,其中由源節(jié)點(diǎn)異步發(fā)送的事務(wù)的一個或多個數(shù)據(jù)庫操作被副本節(jié)點(diǎn)接收,并且源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間的同步通信被用于在副本節(jié)點(diǎn)處預(yù)提交該事務(wù)。圖11是一種數(shù)據(jù)庫協(xié)議的示圖,其中用于事務(wù)的一個或多個數(shù)據(jù)庫操作被從源節(jié)點(diǎn)復(fù)制到副本節(jié)點(diǎn),并且在源節(jié)點(diǎn)不等待接收來自副本節(jié)點(diǎn)的提交確認(rèn)的情況下,向數(shù)據(jù)庫客戶端確認(rèn)該事務(wù)為已提交。圖12是一種用于在數(shù)據(jù)庫環(huán)境內(nèi)從源節(jié)點(diǎn)到副本節(jié)點(diǎn)執(zhí)行復(fù)制的涉及源節(jié)點(diǎn)的示例方法的流程圖,其中在源節(jié)點(diǎn)不等待接收來自副本節(jié)點(diǎn)的提交確認(rèn)的情況下向數(shù)據(jù)庫客戶端確認(rèn)該事務(wù)為已提交。圖13是一種數(shù)據(jù)庫協(xié)議的示圖,其中用于事務(wù)的一個或多個數(shù)據(jù)庫操作被從源節(jié)點(diǎn)復(fù)制到副本節(jié)點(diǎn),其中該(一個或多個)數(shù)據(jù)庫操作被從源節(jié)點(diǎn)異步發(fā)送到副本節(jié)點(diǎn),在源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間有同步通信來在副本節(jié)點(diǎn)處預(yù)提交該事務(wù),并且在源節(jié)點(diǎn)不等待接收來自副本節(jié)點(diǎn)的提交確認(rèn)的情況下向數(shù)據(jù)庫客戶端確認(rèn)該事務(wù)為已提交。圖14a是一種用于在數(shù)據(jù)庫環(huán)境內(nèi)從源節(jié)點(diǎn)到副本節(jié)點(diǎn)執(zhí)行復(fù)制的涉及源節(jié)點(diǎn)的示例方法的流程圖,其中一個或多個數(shù)據(jù)庫操作被從源節(jié)點(diǎn)異步發(fā)送到副本節(jié)點(diǎn),在源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間有同步通信來在副本節(jié)點(diǎn)處預(yù)提交事務(wù),并且在源節(jié)點(diǎn)不等待接收來自副本節(jié)點(diǎn)的提交確認(rèn)的情況下向數(shù)據(jù)庫客戶端確認(rèn)該事務(wù)為已提交。圖14b是一種用于在數(shù)據(jù)庫環(huán)境內(nèi)從源節(jié)點(diǎn)到副本節(jié)點(diǎn)執(zhí)行復(fù)制的涉及副本節(jié)點(diǎn)的示例方法的流程圖,其中一個或多個數(shù)據(jù)庫操作被從源節(jié)點(diǎn)異步發(fā)送到副本節(jié)點(diǎn),在源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間有同步通信來在副本節(jié)點(diǎn)處預(yù)提交事務(wù),并且在源節(jié)點(diǎn)不等待接收來自副本節(jié)點(diǎn)的提交確認(rèn)的情況下向數(shù)據(jù)庫客戶端確認(rèn)該事務(wù)為已提交。圖15是描繪將在源系統(tǒng)處維護(hù)的源表格與在副本系統(tǒng)處維護(hù)的數(shù)據(jù)庫表格的拷貝同步的數(shù)據(jù)庫環(huán)境的示圖。圖16a是一種用于將在源系統(tǒng)處維護(hù)的數(shù)據(jù)庫表格與在副本節(jié)點(diǎn)處維護(hù)的數(shù)據(jù)庫表格的拷貝同步的涉及源節(jié)點(diǎn)的示例方法的流程圖。圖16b是一種用于將在源系統(tǒng)處維護(hù)的數(shù)據(jù)庫表格與在副本節(jié)點(diǎn)處維護(hù)的數(shù)據(jù)庫表格的拷貝同步的涉及副本節(jié)點(diǎn)的示例方法的流程圖。圖17是副本節(jié)點(diǎn)的示圖,圖示了同步時間戳可如何用于判定在副本節(jié)點(diǎn)處是否重放寫入操作。圖18是其中可實(shí)現(xiàn)一些描述的實(shí)施例的示例計算系統(tǒng)的示圖。圖19是可結(jié)合本文描述的技術(shù)使用的示例云計算環(huán)境。具體實(shí)施方式示例1—概述以下描述針對的是用于執(zhí)行數(shù)據(jù)(例如,數(shù)據(jù)庫數(shù)據(jù))的復(fù)制的技術(shù)和解決方案。例如,數(shù)據(jù)庫數(shù)據(jù)的高效復(fù)制可利用數(shù)據(jù)操縱(dml)語句和寫入日志傳送(writelogshipping)來執(zhí)行。當(dāng)在本文使用時,dml語句指的是指定對數(shù)據(jù)的任何操縱(例如,插入、更新、刪除、選擇)的任何語句、命令、消息或其他指令。在一些實(shí)現(xiàn)方式中,(例如,在第一數(shù)據(jù)庫系統(tǒng)處)執(zhí)行dml語句并且創(chuàng)建反映dml語句和事務(wù)提交操作的寫入日志。在一個示例中,對于每個dml語句或事務(wù)提交操作創(chuàng)建單獨(dú)的寫入日志條目。在一具體示例中,寫入日志條目可包括dml語句和關(guān)聯(lián)的參數(shù)和/或值(例如,當(dāng)在另一數(shù)據(jù)庫系統(tǒng)處執(zhí)行該dml語句時可能需要的參數(shù)和/或值)。寫入日志條目可被插入到寫入日志隊(duì)列中并發(fā)送到一個或多個其他數(shù)據(jù)庫系統(tǒng)以便執(zhí)行。這樣,可在第一數(shù)據(jù)庫系統(tǒng)(例如,源主機(jī)或分布在多個源節(jié)點(diǎn)之間的源系統(tǒng))和一個或多個其他數(shù)據(jù)庫系統(tǒng)(例如,具有副本主機(jī)或者在多個副本節(jié)點(diǎn)之間被復(fù)制的副本系統(tǒng))之間復(fù)制數(shù)據(jù)庫數(shù)據(jù)。當(dāng)在本文使用時,源系統(tǒng)指的是數(shù)據(jù)庫信息(例如,一個或多個數(shù)據(jù)庫表格、整個數(shù)據(jù)庫或者對數(shù)據(jù)庫信息的其他選擇)被從其復(fù)制到其他系統(tǒng)的數(shù)據(jù)庫系統(tǒng)(例如,實(shí)現(xiàn)數(shù)據(jù)庫環(huán)境的一個或多個計算設(shè)備)。術(shù)語數(shù)據(jù)庫表格指的是數(shù)據(jù)庫的任何部分,無論是如何組織的。主機(jī)指的是具有處理器和存儲器的計算系統(tǒng)。在一些情況中,源系統(tǒng)可包括多個主機(jī),通常稱為節(jié)點(diǎn)。然而,除非上下文明確地另有指示,否則節(jié)點(diǎn)可以指單主機(jī)系統(tǒng)中的主機(jī),或者系統(tǒng)中的多個主機(jī)之一。主節(jié)點(diǎn)指的是管理關(guān)于主節(jié)點(diǎn)和一個或多個從屬節(jié)點(diǎn)的信息的源節(jié)點(diǎn)。從屬節(jié)點(diǎn)指的是安裝在與主源節(jié)點(diǎn)不同的主機(jī)上的源節(jié)點(diǎn)。表格(例如,數(shù)據(jù)庫表格)在向外擴(kuò)展(scale-out)系統(tǒng)中可被復(fù)制到多個節(jié)點(diǎn)(例如,數(shù)據(jù)庫節(jié)點(diǎn))。此特征通過超越單個機(jī)器的限制利用多個節(jié)點(diǎn)中的多個核,可提供可擴(kuò)展的搜索或查詢吞吐量。其也可在多個表格被復(fù)制在多個節(jié)點(diǎn)上時,通過提供更本地化的訪問,減少用于在這些表格上執(zhí)行的聯(lián)接的網(wǎng)絡(luò)流量。在一具體示例中,數(shù)據(jù)復(fù)制對于在線分析處理(onlineanalyticalprocessing,olap)查詢和操作以及在線事務(wù)處理(onlinetransactionprocessing,oltp)事務(wù)和查詢都可改善數(shù)據(jù)庫系統(tǒng)的性能。然而,當(dāng)dml語句被以同步方式復(fù)制時(例如,當(dāng)在同一事務(wù)邊界內(nèi)的源系統(tǒng)和副本系統(tǒng)上執(zhí)行dml語句時,其中所有節(jié)點(diǎn)上的執(zhí)行必須在事務(wù)被提交之前完成),性能懲罰可發(fā)生。在一些情況中,通過異步復(fù)制可減輕懲罰,這實(shí)現(xiàn)了向外擴(kuò)展的益處。在異步復(fù)制的一些實(shí)現(xiàn)方式中,當(dāng)事務(wù)中的dml語句在源系統(tǒng)處被提交時事務(wù)被提交,并且變化被傳播到事務(wù)邊界外的副本系統(tǒng)。當(dāng)在本文使用時,副本系統(tǒng)指的是從源系統(tǒng)復(fù)制數(shù)據(jù)庫信息(例如,復(fù)制一個或多個數(shù)據(jù)庫表格、整個數(shù)據(jù)庫或者數(shù)據(jù)庫信息的其他選擇)的數(shù)據(jù)庫系統(tǒng),其中源系統(tǒng)例如是單個源主機(jī)或者分布在多個源節(jié)點(diǎn)之間的源系統(tǒng)。在一些示例中,副本系統(tǒng)可包括單個副本主機(jī)。在其他示例中,副本系統(tǒng)包括多個副本節(jié)點(diǎn),這些副本節(jié)點(diǎn)可存儲在源系統(tǒng)處維護(hù)的數(shù)據(jù)庫表格的多個拷貝,具有分布在多個副本節(jié)點(diǎn)間的源數(shù)據(jù)庫表格,或者上述的組合。在另外的示例中,單個表格可分布在多個源節(jié)點(diǎn)間和/或可分布在多個副本節(jié)點(diǎn)間。分布式數(shù)據(jù)庫系統(tǒng)(例如,包括多于一個副本節(jié)點(diǎn)、多于一個源節(jié)點(diǎn)或者多于一個源節(jié)點(diǎn)和多于一個副本節(jié)點(diǎn)的數(shù)據(jù)庫系統(tǒng))中的不同數(shù)據(jù)庫節(jié)點(diǎn)處的數(shù)據(jù)可以是在數(shù)據(jù)庫節(jié)點(diǎn)之間分區(qū)(即,劃分、分割)的數(shù)據(jù)庫表格。數(shù)據(jù)庫表格可在行之間(不同分區(qū)中的不同行)和/或列之間(不同分區(qū)中的不同列)被分區(qū)。分布式數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)庫節(jié)點(diǎn)可包含分區(qū)表格的一個或多個分區(qū)(部分)?;蛘撸謪^(qū)的數(shù)據(jù)被以某種其他方式來組織。除非另有指示,否則數(shù)據(jù)庫表格可以指數(shù)據(jù)庫表格的分區(qū)。在另外的示例中,表格不被分區(qū)。當(dāng)被分區(qū)時,數(shù)據(jù)庫表格可被在多個源節(jié)點(diǎn)之間分割并且被復(fù)制到多個副本節(jié)點(diǎn)。在一些情況中,分區(qū)在源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間是相同的,而在其他情況中是不同的。在其他實(shí)現(xiàn)方式中,表格可在源節(jié)點(diǎn)處被分區(qū),但被復(fù)制到單個副本節(jié)點(diǎn)處的單個未分區(qū)的副本表格。在另外的示例中,在源節(jié)點(diǎn)處未被分區(qū)的表格可被分區(qū)并分布到多個副本節(jié)點(diǎn)。示例2—寫入日志在本文的任何示例中,可利用寫入日志來復(fù)制dml語句(例如,dml結(jié)構(gòu)化查詢語言(structuredquerylanguage,sql)語句)。例如,可創(chuàng)建寫入日志格式,其包括具有與dml語句相關(guān)聯(lián)的附加信息(例如,在執(zhí)行dml語句時使用的附加信息)的dml語句。在一些實(shí)現(xiàn)方式中,寫入日志條目包括單個dml語句。在一些實(shí)現(xiàn)方式中,寫入日志條目包括事務(wù)標(biāo)識符(id)、dml語句、參數(shù)值和非確定值。事務(wù)標(biāo)識符標(biāo)識(例如,唯一標(biāo)識)dml復(fù)制事務(wù)。例如,事務(wù)標(biāo)識符可唯一標(biāo)識在源系統(tǒng)和dml語句將在其中被執(zhí)行的一個或多個副本節(jié)點(diǎn)上發(fā)生的dml復(fù)制事務(wù)。dml語句可以是用于修改(例如,添加、更新和/或刪除)數(shù)據(jù)的語句。例如,dml語句可以是用于修改數(shù)據(jù)庫中的數(shù)據(jù)的sql語句。在一些實(shí)現(xiàn)方式中,dml語句是sql插入、更新或刪除語句(例如,單個sql插入、更新或刪除語句)。參數(shù)值是被dml語句使用的值。例如,參數(shù)值可以是用于綁定到dml語句(例如,準(zhǔn)備的或預(yù)編譯的dmlsql語句)中的變量的值。當(dāng)dml語句被執(zhí)行(例如,重放)時,綁定變量可被其相應(yīng)的參數(shù)值所替換。例如,如果dml語句包含變量“名字”,則當(dāng)dml語句被執(zhí)行時該變量可被特定的字符串值所替換(例如,變量“名字”可被具體值所替換,例如“約翰”)。非確定值指的是在不同的計算設(shè)備之間可不同的值(例如,在源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間不同)。例如,時間戳函數(shù)當(dāng)在源系統(tǒng)上運(yùn)行時將返回當(dāng)前時間戳值,當(dāng)以后某時在副本系統(tǒng)上運(yùn)行時其可以是不同的時間戳值。在相同的值要被用于這種非確定性函數(shù)的實(shí)現(xiàn)方式中,非確定性函數(shù)可被評估一次(例如,在源系統(tǒng)上)并且所得到的值可在邏輯日志中被提供給副本系統(tǒng),使得當(dāng)dml語句在副本系統(tǒng)上被執(zhí)行時,相同的值將被使用(曾在源系統(tǒng)處使用的那個值)。例如,非確定性函數(shù)(例如,當(dāng)前時間戳函數(shù))可在源系統(tǒng)處在dml語句執(zhí)行期間被評估并且所得到的值可在寫入日志條目中被發(fā)送到副本系統(tǒng)以用于在副本系統(tǒng)處執(zhí)行dml語句時使用。在一些實(shí)現(xiàn)方式中,寫入日志條目是用于利用dml語句在副本位置(例如,副本節(jié)點(diǎn))執(zhí)行數(shù)據(jù)的復(fù)制的傳送值的集合。在一具體實(shí)現(xiàn)方式中,寫入日志條目包括:*事務(wù)id*dmlsql語句*參數(shù)值:準(zhǔn)備的語句中的綁定變量(標(biāo)記為“?”)的值。*非確定值:如果sql語句包括非確定性函數(shù),例如序列或current_timestamp(當(dāng)前_時間戳)函數(shù),則可包括非確定性函數(shù)的評估值。當(dāng)在本文使用時,術(shù)語“傳送(ship)”或“發(fā)送(send)”到目的地實(shí)體指的是在計算機(jī)系統(tǒng)內(nèi)或者兩個計算機(jī)系統(tǒng)之間傳輸或以其他方式輸送數(shù)據(jù)的任何方式,無論是直接輸送數(shù)據(jù)還是通過一個或多個中間實(shí)體輸送數(shù)據(jù)。類似地,術(shù)語“接收”,例如從源實(shí)體接收,指的是在計算機(jī)系統(tǒng)內(nèi)或者在兩個計算機(jī)系統(tǒng)之間接收數(shù)據(jù),無論是從原始發(fā)送的計算機(jī)系統(tǒng)直接接收數(shù)據(jù)還是通過一個或多個中間實(shí)體接收數(shù)據(jù)。如上所述,寫入日志條目可包括關(guān)于數(shù)據(jù)庫事務(wù)的其他特征的信息。在一個方面中,寫入日志包括用于當(dāng)事務(wù)被源系統(tǒng)提交時的條目。例如,事務(wù)可包括多個dml語句。在一個實(shí)現(xiàn)方式中,當(dāng)在源系統(tǒng)上已執(zhí)行了事務(wù)中的所有dml語句時,該事務(wù)被提交。寫入日志可包括額外的條目,例如關(guān)于已在源系統(tǒng)上被預(yù)提交的事務(wù)內(nèi)的個體dml語句的額外條目。示例3—利用dml語句提供復(fù)制的環(huán)境在本文的任何示例中,可以為利用dml語句和寫入日志的更高效復(fù)制(例如,數(shù)據(jù)庫信息的復(fù)制)提供技術(shù)。例如,dml語句可在源系統(tǒng)處被執(zhí)行并且被包含到寫入日志中以便發(fā)送(傳送)到副本系統(tǒng)以供執(zhí)行,來在源系統(tǒng)和副本系統(tǒng)之間為一個或多個數(shù)據(jù)庫表格復(fù)制數(shù)據(jù)。此外,dml復(fù)制可被應(yīng)用到不同類型的存儲引擎,例如行存儲、列存儲等等。在一些實(shí)現(xiàn)方式中,具有寫入日志傳送的dml復(fù)制(例如,dml同步復(fù)制)的概念旨在以最低限度的復(fù)制開銷跨多個節(jié)點(diǎn)執(zhí)行復(fù)制。然而,同步復(fù)制可導(dǎo)致更長的響應(yīng)時間,因?yàn)樵春?一個或多個)副本都在同一事務(wù)邊界中被更新。異步復(fù)制——其中副本不一定是在同一事務(wù)邊界中更新的——可允許使用副本系統(tǒng),同時對于源系統(tǒng)處的寫入事務(wù)改善了響應(yīng)時間。然而,異步復(fù)制通常涉及副本表格上的讀取請求可能返回與源表格相比過時的信息的風(fēng)險。圖1是圖示出利用dml語句和寫入日志傳送的數(shù)據(jù)庫數(shù)據(jù)復(fù)制的圖解100。如圖解100所示,客戶端110(例如,客戶端計算設(shè)備)與源系統(tǒng)120(例如,操作數(shù)據(jù)庫的一個或多個服務(wù)器計算機(jī),在該處數(shù)據(jù)將被修改并被復(fù)制到副本系統(tǒng))通信。例如,客戶端110可執(zhí)行數(shù)據(jù)庫操縱操作(例如,在存儲于源系統(tǒng)120處的一個或多個數(shù)據(jù)庫表格中插入數(shù)據(jù)、改變數(shù)據(jù)和/或刪除數(shù)據(jù))。源系統(tǒng)120包括數(shù)個組件,其中包括會話/事務(wù)組件122、dml執(zhí)行組件124和存儲引擎126(例如,行存儲和/或列存儲存儲引擎)。存儲引擎126在持久性存儲128(例如,硬盤驅(qū)動器、固態(tài)驅(qū)動器和/或其他類型的持久性存儲裝置)中存儲數(shù)據(jù)庫數(shù)據(jù)。源系統(tǒng)120可接收來自客戶端110和/或來自其他客戶端或源的數(shù)據(jù)操縱操作(添加、修改和/或刪除數(shù)據(jù)的操作,例如以插入、更新和/或刪除dml語句的形式)。在接收到數(shù)據(jù)操縱操作時(例如,經(jīng)由會話/事務(wù)組件122接收),源系統(tǒng)120可執(zhí)行dml語句來執(zhí)行數(shù)據(jù)操縱操作(例如,經(jīng)由dml執(zhí)行組件124執(zhí)行)。源系統(tǒng)120也可創(chuàng)建包含dml語句的寫入日志條目并將它們(如140處所示)發(fā)送到副本系統(tǒng)130以便執(zhí)行。副本系統(tǒng)130可接收寫入日志并且執(zhí)行其內(nèi)包含的條目,包括dml語句(例如,連同寫入日志中的其他參數(shù)、值和/或其他關(guān)聯(lián)信息)、事務(wù)提交操作和dml語句預(yù)提交操作。例如,副本系統(tǒng)130可包括與源系統(tǒng)120類似的組件(例如,會話/事務(wù)組件132、dml執(zhí)行組件134、存儲引擎136和持久性存儲138)。副本系統(tǒng)130可經(jīng)由dml語句復(fù)制源系統(tǒng)120處存儲的數(shù)據(jù)庫信息(例如,一個或多個數(shù)據(jù)庫表格)(例如,使得源系統(tǒng)120處的數(shù)據(jù)庫數(shù)據(jù)變化被復(fù)制到副本系統(tǒng)130)。在一些情況中,副本系統(tǒng)130可執(zhí)行dml語句并將結(jié)果返回給源系統(tǒng)120。結(jié)果可被提供給源系統(tǒng)120和/或客戶端110。圖2是描繪用于利用dml語句和寫入日志傳送執(zhí)行數(shù)據(jù)庫表格的復(fù)制的示例數(shù)據(jù)庫環(huán)境200的示圖。數(shù)據(jù)庫環(huán)境200包括數(shù)個副本節(jié)點(diǎn)220、230,數(shù)據(jù)庫表格216在它們之間被復(fù)制。如數(shù)據(jù)庫環(huán)境200中所示,源系統(tǒng)210(例如,源主機(jī)或源節(jié)點(diǎn))包括支持?jǐn)?shù)據(jù)庫活動和復(fù)制的數(shù)個組件。具體而言,源系統(tǒng)210存儲數(shù)據(jù)庫表格216(例如,存儲在存儲器中和/或存儲在一個或多個持久性存儲倉庫中)。源系統(tǒng)210包括dml執(zhí)行組件212,該dml執(zhí)行組件212執(zhí)行讀取和/或?qū)懭霐?shù)據(jù)庫表格216中的數(shù)據(jù)庫數(shù)據(jù)的dml語句。源系統(tǒng)210還包括用于存儲寫入日志的寫入日志隊(duì)列214和用于將寫入日志發(fā)送到其他數(shù)據(jù)庫節(jié)點(diǎn)(例如,發(fā)送到副本節(jié)點(diǎn)220和/或230)的復(fù)制處理程序218。為了復(fù)制數(shù)據(jù)庫表格(例如,復(fù)制存儲在一個或多個數(shù)據(jù)庫表格中的數(shù)據(jù)庫信息以使得數(shù)據(jù)庫表格在數(shù)據(jù)庫節(jié)點(diǎn)之間保持同步),源系統(tǒng)210的dml執(zhí)行組件212可接收dml語句(例如,最初來自用戶或來自另外的源)并且在數(shù)據(jù)庫表格216之一上執(zhí)行該dml語句(例如,添加、修改和/或刪除該數(shù)據(jù)庫表格中的數(shù)據(jù),該數(shù)據(jù)庫表格可被稱為主表格)。dml執(zhí)行組件212隨后可創(chuàng)建寫入日志條目(其包括dml語句)并且將該寫入日志條目插入到寫入日志隊(duì)列214中。一旦寫入日志條目已被插入到寫入日志隊(duì)列214中,dml執(zhí)行組件212就可自由地處理其他dml請求(例如,dml執(zhí)行組件212在執(zhí)行其他dml操作之前不必等待該寫入日志條目被復(fù)制到副本節(jié)點(diǎn)220、230)。在一些實(shí)現(xiàn)方式中,dml執(zhí)行組件212包括數(shù)個執(zhí)行的線程,其中每個線程可獨(dú)立工作來處理dml請求。在這種實(shí)現(xiàn)方式中,線程可執(zhí)行dml語句,創(chuàng)建寫入日志條目(其包括dml語句),將寫入日志條目插入到寫入日志隊(duì)列214中,并且自由地處理其他請求,而不必等待dml語句的復(fù)制完成(例如,不必等待dml語句被發(fā)送到其他節(jié)點(diǎn)或者等待其他節(jié)點(diǎn)處的dml語句執(zhí)行的結(jié)果)。在一些實(shí)現(xiàn)方式中,dml執(zhí)行組件212在關(guān)于數(shù)據(jù)庫表格執(zhí)行dml語句時確定dml語句使用的參數(shù)值和/或非確定值。在這種實(shí)現(xiàn)方式中,dml執(zhí)行組件212可將參數(shù)值和/或非確定值與dml語句一起包括在寫入日志條目中。dml執(zhí)行組件212還可將事務(wù)標(biāo)識符包括在寫入日志條目中來標(biāo)識復(fù)制事務(wù)。dml執(zhí)行組件212對dml語句的執(zhí)行進(jìn)行排序,使得任何給定的dml語句直到其影響的下層數(shù)據(jù)準(zhǔn)備就緒為止不會被執(zhí)行。例如,對于記錄的更新語句直到添加該記錄的插入語句之后為止不被執(zhí)行。dml執(zhí)行組件212可修改指出在寫入日志條目中如何串行化dml語句的信息(例如,在充當(dāng)狀態(tài)計數(shù)器的非確定值或行id值中)。源系統(tǒng)210還包括用于處理寫入日志隊(duì)列214中的寫入日志條目的復(fù)制處理程序218。復(fù)制處理程序218可從寫入日志隊(duì)列214取得寫入日志并將它們發(fā)送到一個或多個副本節(jié)點(diǎn)(例如,節(jié)點(diǎn)220和/或節(jié)點(diǎn)230)以便副本節(jié)點(diǎn)220、230通過執(zhí)行寫入日志條目內(nèi)包含的dml語句來執(zhí)行復(fù)制。例如,復(fù)制處理程序218可從寫入日志隊(duì)列214取回寫入日志條目并將該寫入日志條目發(fā)送到節(jié)點(diǎn)220和/或節(jié)點(diǎn)230。寫入日志條目在被路由到副本節(jié)點(diǎn)220、230時可經(jīng)過各種內(nèi)部或外部結(jié)構(gòu)、隊(duì)列等等。接收寫入日志條目的副本節(jié)點(diǎn),例如副本節(jié)點(diǎn)220,可接收寫入日志條目并將其插入到作業(yè)隊(duì)列222中。副本節(jié)點(diǎn)220對寫入日志條目的接收可由單獨(dú)的組件(例如,寫入日志接收器組件,未圖示)或者由作業(yè)隊(duì)列222執(zhí)行。一旦寫入日志條目已被接收并插入到作業(yè)隊(duì)列222中,作業(yè)執(zhí)行組件224就可取回寫入日志條目并且在復(fù)制的數(shù)據(jù)庫表格226之一上執(zhí)行其內(nèi)包含的dml語句(例如,連同參數(shù)值和/或非確定值,如果存在的話)。其他副本節(jié)點(diǎn)也可從復(fù)制處理程序218接收寫入日志條目(例如,節(jié)點(diǎn)230,具有其自己的作業(yè)隊(duì)列232、作業(yè)執(zhí)行組件234和復(fù)制數(shù)據(jù)庫表格236)。在一些實(shí)現(xiàn)方式中,數(shù)據(jù)庫表格可被逐節(jié)點(diǎn)地復(fù)制。例如,源系統(tǒng)(例如,源系統(tǒng)210)可存儲數(shù)據(jù)庫表格的完整集合,而第一副本節(jié)點(diǎn)(例如,節(jié)點(diǎn)220)可復(fù)制源系統(tǒng)處存儲的表格中的一些或全部并且第二副本節(jié)點(diǎn)(例如,節(jié)點(diǎn)230)也可復(fù)制源系統(tǒng)210處存儲的表格中的一些或全部。此外,每個副本節(jié)點(diǎn)220、230可復(fù)制與一個或多個其他副本節(jié)點(diǎn)相同的表格,或者可復(fù)制與一個或多個其他副本節(jié)點(diǎn)不同的表格。作為示例,源系統(tǒng)210可存儲數(shù)據(jù)庫表格1、2和3。副本節(jié)點(diǎn)220可復(fù)制數(shù)據(jù)庫表格1和2。副本節(jié)點(diǎn)230可復(fù)制數(shù)據(jù)庫表格1和3。在一些實(shí)現(xiàn)方式中,包含修改特定數(shù)據(jù)庫表格的dml語句的寫入日志條目被發(fā)送到復(fù)制該特定數(shù)據(jù)庫表格的副本節(jié)點(diǎn)(例如,只發(fā)送到復(fù)制該特定數(shù)據(jù)庫表格的那些副本節(jié)點(diǎn),而不發(fā)送到?jīng)]有復(fù)制該特定數(shù)據(jù)庫表格的副本節(jié)點(diǎn))。例如,復(fù)制處理程序218可將來自寫入日志隊(duì)列214的寫入日志條目發(fā)送到復(fù)制被該寫入日志條目內(nèi)的dml語句修改的數(shù)據(jù)庫表格的副本節(jié)點(diǎn)。在一些實(shí)現(xiàn)方式中,執(zhí)行寫入日志條目的分組。例如,對在特定副本節(jié)點(diǎn)處復(fù)制的數(shù)據(jù)庫表格進(jìn)行修改的多個寫入日志條目可被分組并發(fā)送到該特定副本節(jié)點(diǎn)??紤]這樣一種示例布置:其中,源系統(tǒng)210存儲數(shù)據(jù)庫表格1、2和3,副本節(jié)點(diǎn)220復(fù)制數(shù)據(jù)庫表格1和2,并且副本節(jié)點(diǎn)230復(fù)制數(shù)據(jù)庫表格1和3。在這個示例布置中,如果寫入日志隊(duì)列214包含全都修改數(shù)據(jù)庫表格1中存儲的數(shù)據(jù)庫信息的三個寫入日志條目,則這三個寫入日志條目可被分組(例如,被組合到一寫入日志群組中)并被發(fā)送到都復(fù)制表格1的副本節(jié)點(diǎn)220和副本節(jié)點(diǎn)230兩者。如果寫入日志隊(duì)列214包含都修改數(shù)據(jù)庫表格3中存儲的數(shù)據(jù)庫信息的兩個寫入日志條目,則這兩個寫入日志條目可被分組并被發(fā)送到復(fù)制數(shù)據(jù)庫表格3的副本節(jié)點(diǎn)230(而不被發(fā)送到不復(fù)制數(shù)據(jù)庫表格3的副本節(jié)點(diǎn)220)。如果寫入日志隊(duì)列214包含都修改數(shù)據(jù)庫表格1中存儲的數(shù)據(jù)庫信息的兩個寫入日志條目和修改數(shù)據(jù)庫表格2中存儲的數(shù)據(jù)庫信息的一個寫入日志條目,則第一寫入日志群組可被創(chuàng)建來將所有三個寫入日志條目發(fā)送到副本節(jié)點(diǎn)220并且第二寫入日志群組可被創(chuàng)建來僅將修改表格1的兩個寫入日志條目發(fā)送到副本節(jié)點(diǎn)230。寫入日志分組可被應(yīng)用來使得網(wǎng)絡(luò)資源可被更高效地利用。例如,為了最小化復(fù)制的懲罰,可以使用寫入日志分組,其中用于多個客戶端的多個寫入日志條目被分組到單個網(wǎng)絡(luò)通信中。此技術(shù)可減少執(zhí)行復(fù)制所需要的網(wǎng)絡(luò)資源并且可增大dml執(zhí)行吞吐量。接收寫入日志條目的副本節(jié)點(diǎn)220、230的作業(yè)執(zhí)行組件224、234可包括用于執(zhí)行作業(yè)隊(duì)列中的作業(yè)的數(shù)個進(jìn)程或線程。例如,副本節(jié)點(diǎn)220的作業(yè)執(zhí)行組件224可包括從作業(yè)隊(duì)列222取回寫入日志條目并執(zhí)行它們的數(shù)個作業(yè)執(zhí)行線程。在一些實(shí)現(xiàn)方式中,作業(yè)執(zhí)行線程可并行執(zhí)行寫入日志條目,這可增大效率。在分派寫入日志條目時,作業(yè)執(zhí)行組件224可使用信息(例如,充當(dāng)狀態(tài)計數(shù)器的非確定值或行id值)來控制執(zhí)行的時機(jī)(timing),使得任何給定的dml語句直到其影響的下層數(shù)據(jù)準(zhǔn)備就緒為止不被執(zhí)行。在一些實(shí)現(xiàn)方式中,dml語句在一源節(jié)點(diǎn)(或多個源節(jié)點(diǎn))和一個或多個副本節(jié)點(diǎn)上在同一事務(wù)邊界(也稱為執(zhí)行邊界)內(nèi)被執(zhí)行。例如,一個或多個dml語句可與事務(wù)(例如,由事務(wù)標(biāo)識符標(biāo)識)相關(guān)聯(lián)。與事務(wù)相關(guān)聯(lián)的一個或多個dml語句可在一源節(jié)點(diǎn)(或多個源節(jié)點(diǎn))處被執(zhí)行,被包含到寫入日志中并發(fā)送到一個或多個副本節(jié)點(diǎn),并且在副本節(jié)點(diǎn)處在同一事務(wù)邊界內(nèi)被執(zhí)行。在一些實(shí)現(xiàn)方式中,dml語句在副本節(jié)點(diǎn)處在整體事務(wù)邊界的子語句邊界內(nèi)被執(zhí)行。在一些實(shí)現(xiàn)方式中,事務(wù)邊界內(nèi)的dml語句可被回滾。例如,正在一源節(jié)點(diǎn)和一個或多個副本節(jié)點(diǎn)上執(zhí)行的dml語句可跨這些源節(jié)點(diǎn)和副本節(jié)點(diǎn)被回滾(例如,如果節(jié)點(diǎn)之一處的執(zhí)行失敗的話)。在一些實(shí)現(xiàn)方式中,支持局部回滾,其中事務(wù)的一個或多個dml語句可獨(dú)立于該事務(wù)的一個或多個其他dml語句被回滾。例如,如果事務(wù)包括多個dml語句,并且dml語句之一在源節(jié)點(diǎn)上被回滾,則該dml語句也可在任何副本節(jié)點(diǎn)上被回滾。事務(wù)邊界內(nèi)的dml語句的執(zhí)行可提供數(shù)據(jù)庫一致性。例如,dml語句可在源節(jié)點(diǎn)和一個或多個副本節(jié)點(diǎn)上被執(zhí)行并且在同一事務(wù)邊界內(nèi)被提交(例如,利用原子提交操作來提交)。在一些實(shí)現(xiàn)方式中,線程解耦被用于提供更高效的復(fù)制。在一些實(shí)現(xiàn)方式中,單獨(dú)的線程(例如,專用的處理程序線程)執(zhí)行寫入日志傳送(例如,包括從寫入日志隊(duì)列取回寫入日志、分組和/或發(fā)送到副本節(jié)點(diǎn)在內(nèi)的操作)。對于寫入日志傳送和dml執(zhí)行使用單獨(dú)的線程可解放dml執(zhí)行線程以使其不必執(zhí)行寫入日志傳送操作(例如,dml執(zhí)行線程一旦將寫入日志放入了寫入日志隊(duì)列中就可自由處理其他dml操作)。例如,dml執(zhí)行線程可從其他源取得待處理的dml作業(yè),而不必等待已被發(fā)送到副本節(jié)點(diǎn)的寫入日志的結(jié)果。圖3是描繪用于執(zhí)行從源系統(tǒng)302到具有副本節(jié)點(diǎn)304、306的副本系統(tǒng)的數(shù)據(jù)庫表格的復(fù)制的數(shù)據(jù)庫環(huán)境300的示圖。雖然描繪了兩個副本節(jié)點(diǎn),但數(shù)據(jù)庫表格的復(fù)制可在源系統(tǒng)302和任意數(shù)目的副本節(jié)點(diǎn)之間執(zhí)行。如示例數(shù)據(jù)庫環(huán)境300中所示,源系統(tǒng)302包括數(shù)個dml執(zhí)行器312(用于處理dml請求的執(zhí)行線程)。為了支持復(fù)制,寫入集合提取器316從dml請求中提取適當(dāng)?shù)膁ml信息。類似地,事務(wù)管理器320監(jiān)視事務(wù)提交操作。提交操作確定事務(wù)的結(jié)果何時可用于讀取。讀取請求通常將接收記錄的最近提交版本,即使記錄當(dāng)前正被dml操作所修改。日志生成器324與事務(wù)管理器320和寫入集合提取器316通信。日志生成器324對于寫入和提交操作生成日志條目并且將它們添加到寫入日志隊(duì)列314。寫入日志隊(duì)列314被清空,并且日志條目被與日志生成器324通信的日志發(fā)送器328發(fā)送到適當(dāng)?shù)母北竟?jié)點(diǎn)(例如,通過一個或多個中間節(jié)點(diǎn))。在一些情況下,寫入日志可被分組到一起以使得多個日志可在單次通信中被發(fā)送到副本節(jié)點(diǎn)。當(dāng)數(shù)據(jù)庫環(huán)境包括復(fù)制源系統(tǒng)(例如源主機(jī))的不同部分的多個副本時,在特定實(shí)現(xiàn)方式中,副本節(jié)點(diǎn)可以只接收和執(zhí)行對于由該副本節(jié)點(diǎn)復(fù)制的表格的寫入日志。因此,邏輯日志分組可考慮到由特定副本節(jié)點(diǎn)復(fù)制的表格。每個副本節(jié)點(diǎn)304、306包括日志接收器和分派器332。日志接收器和分派器332從日志發(fā)送器328接收寫入日志條目。日志接收器和分派器332解析寫入日志條目。寫入操作被日志接收器和分派器332發(fā)送到并行寫入日志重放器336,而提交操作被日志接收器和分派器332發(fā)送到事務(wù)提交日志重放器340。如圖3中所示,并行寫入日志重放器336包括可并發(fā)操作的多個重放器344。在缺乏寫入操作之間的依從性的情況下,通過允許復(fù)制的表格上的多個寫入操作被同時執(zhí)行,此結(jié)構(gòu)幫助改善了系統(tǒng)性能。在至少一些實(shí)現(xiàn)方式中,與同一事務(wù)相關(guān)聯(lián)的寫入日志被同一重放器344按與在源節(jié)點(diǎn)處發(fā)生的操作相同的順序重放。為了幫助確保源系統(tǒng)302和副本節(jié)點(diǎn)304、306之間的一致性,事務(wù)提交日志重放器串行操作,例如以單個重放器348來操作。另外,日志接收器和分派器332可使用與寫入日志條目一起提供的信息來對寫入操作適當(dāng)排序,履行(honor)寫入操作之間的依從性。本公開的至少某些實(shí)現(xiàn)方式包括幫助維持系統(tǒng)300中的一致性的附加特征。也就是說,每個復(fù)制的表格使其自身與行id生成器相關(guān)聯(lián)。每次在表格內(nèi)的記錄上執(zhí)行寫入(改變)操作時,行id生成器的值就被遞增。該值被拷貝到正被改變的數(shù)據(jù)庫記錄的行id列。當(dāng)寫入日志條目被日志生成器(324,圖3)生成時,該信息可被包括在寫入日志條目中。例如,插入新記錄的操作將包括關(guān)于插入的記錄的(新的、遞增的)行id的信息。更新記錄的操作將產(chǎn)生包括關(guān)于寫入操作前的記錄的行id和寫入操作后的遞增的行id的信息的寫入日志。刪除操作將包括關(guān)于刪除的行的行id的信息。在特定實(shí)現(xiàn)方式中,刪除操作不會導(dǎo)致——至少不會立即導(dǎo)致——記錄的刪除。也就是說,刪除的記錄可被維護(hù)為記錄的新版本,并且在一些示例中,被鏈接到先前記錄版本。新記錄可被指派新的行id。唯一行id的使用既可在正在進(jìn)行復(fù)制數(shù)據(jù)時有所幫助,也可在繼續(xù)開始復(fù)制時有所幫助,例如由于手動干預(yù)或系統(tǒng)異常而恢復(fù)復(fù)制時。源302和副本表格(例如位于副本304處的表格)都可包括行id信息,例如包括在各自表格的列中。當(dāng)復(fù)制被重啟時,例如當(dāng)在系統(tǒng)異常、手動重啟或斷電又再通電恢復(fù)復(fù)制服務(wù)之后重啟副本節(jié)點(diǎn)304時,由源302容宿的源表格的行id列值可被與其在副本節(jié)點(diǎn)304處的副本表格的行id列值相比較。如果在它們之間存在任何不匹配的行id,則它們可被識別為丟失的變化(lostchange)并且可通過從源表格重發(fā)送相應(yīng)數(shù)據(jù)或者通過刪除副本處的相應(yīng)行來加以解決。例如,如果行id值在源302和副本304處都存在,則數(shù)據(jù)是一致的并且在重啟復(fù)制時對于該行id不需要采取行動。如果行id值只存在于源302處的表格處,則相應(yīng)的數(shù)據(jù)庫記錄被從源302發(fā)送(或重發(fā)送)到副本304以插入到表格的拷貝中。如果行id值只存在于由副本304容宿的表格拷貝處,則其可被從表格拷貝中刪除。用于在重啟復(fù)制時同步源表格和副本表格的上述方法可被修改來改善性能或者減小在源表格的副本表格之間或者在副本304中容宿的不同復(fù)制表格的拷貝之間不一致的數(shù)據(jù)的變化。可用于本公開的至少某些示例的一個這種修改在示例8中描述。示例4—記錄版本可見性關(guān)于常用于引導(dǎo)數(shù)據(jù)庫環(huán)境的操作的acid(原子性、一致性、隔離性和耐久性)的原則中的四個屬性中的隔離性屬性,本公開的至少一些數(shù)據(jù)庫環(huán)境可提供快照隔離的兩個變體中的一者或兩者:語句級快照隔離(statement-levelsnapshotisolation,ssi)和事務(wù)級快照隔離(transaction-levelsnapshotisolation,tsi)。快照隔離提供針對任何并發(fā)寫入事務(wù)的無阻塞讀取訪問.如果事務(wù)包括一個或多個語句(例如數(shù)據(jù)操縱語言或者dml語句),并且這些語句可以是讀取和寫入的任一者(例如,insert(插入)、updata(更新)或delete(刪除)),則在ssi中,每個語句從該語句開始時的提交數(shù)據(jù)的快照讀取數(shù)據(jù)。在tsi中,每個事務(wù)從事務(wù)開始時的提交數(shù)據(jù)的快照讀取數(shù)據(jù),稱為快照時間戳。在至少一些數(shù)據(jù)庫環(huán)境中,ssi和tsi可共存,例如可對每個用戶連接配置。ssi和tsi的定義意味著數(shù)據(jù)一旦分別在語句或事務(wù)中被讀取則應(yīng)當(dāng)在同一語句或事務(wù)內(nèi)再次可見,即使該數(shù)據(jù)已被另一不同的并發(fā)事務(wù)所改變。例如,當(dāng)以某個謂詞執(zhí)行聯(lián)接查詢時,同一記錄在單個語句范圍內(nèi)可多次被訪問,因?yàn)椴樵儾僮鞣闹虚g結(jié)果可由對于被過濾的記錄的一組引用(例如,行id)傳遞到下一個查詢操作符,而不一定完全具體化它們。雖然在快照隔離下可發(fā)生寫入偏斜(writeskew)異常,其中兩個事務(wù)并發(fā)讀取重疊的數(shù)據(jù),做出互斥的更新,并且提交,但通常在實(shí)踐中可通過在應(yīng)用中適當(dāng)?shù)厥褂胹electforupdate(為更新進(jìn)行選擇)來避免這種情況。與像樂觀(optimistic)并發(fā)控制或兩階段鎖定這樣的其他并發(fā)控制選項(xiàng)不同,快照隔離的一個益處在于讀取查詢即使讀取正被其他事務(wù)改變的數(shù)據(jù)庫對象也可繼續(xù)進(jìn)行下去,而沒有任何查詢中止或任何鎖定等待情形。通常,在ssi和tsi中,在新快照開始時向該新快照指派快照時間戳。在ssi下,每個語句具有其自己的快照,而在tsi下每個事務(wù)具有其自己的快照??煺諘r間戳指派操作的成本通常在ssi中變得比在tsi中更顯著,因?yàn)榭煺諘r間戳在tsi下是對每個事務(wù)指派的,而在ssi下是對每個語句指派的。ssi從而在數(shù)據(jù)庫內(nèi)核內(nèi)提供了更多優(yōu)化空間,因?yàn)橥ㄟ^在實(shí)際執(zhí)行語句之前查找語句的查詢計劃可以知道在該特定快照范圍中需要訪問哪些表格或分區(qū)。在本公開的一些方面中,數(shù)據(jù)庫環(huán)境包括具有數(shù)據(jù)庫記錄的表格。在每次更新操作時創(chuàng)建記錄的新版本,而不是覆蓋(override)現(xiàn)有的記錄版本。即使對于記錄刪除操作,也通常創(chuàng)建新的版本頭部并且有效載荷為空,而不是立刻刪除現(xiàn)有記錄。當(dāng)創(chuàng)建新記錄版本時,例如在版本頭部中存儲表示版本創(chuàng)建時間(創(chuàng)建該版本的事務(wù)的提交時間(例如,提交id))的版本令牌,例如版本時間戳。在特定實(shí)現(xiàn)方式中,版本時間戳是從由中央事務(wù)管理器(其例如可以是圖3的源節(jié)點(diǎn)302)維護(hù)的全局同步令牌得到的,該全局同步令牌例如是事務(wù)提交時間戳,其將在寫入事務(wù)的每次提交時被遞增。根據(jù)特定示例,單個記錄的各版本被按排序的順序鏈接到彼此,例如按其版本時間戳來鏈接。版本鏈中的較老版本可在滿足指定標(biāo)準(zhǔn)時,例如當(dāng)判定在系統(tǒng)中對于該記錄版本沒有潛在讀取者時,例如在有時被稱為垃圾收集的過程中被刪除。在特定實(shí)現(xiàn)方式中,在系統(tǒng)中沒有潛在讀取者可通過維護(hù)系統(tǒng)中的活躍快照的快照時間戳的最小值并且將其與垃圾收集候選者的版本時間戳相比較來檢測。當(dāng)查詢嘗試讀取記錄版本時,通過將該查詢的快照時間戳與候選記錄版本的版本時間戳相比較來檢查記錄的可見性。如果記錄的版本時間戳高于查詢的快照時間戳,則該特定記錄版本通常應(yīng)當(dāng)不對該查詢可見,因?yàn)樵撚涗浀乃鶆?chuàng)建的版本是在該查詢開始之后被提交的。否則,如果記錄的版本時間戳不高于查詢的快照時間戳,則該記錄版本通常應(yīng)當(dāng)對該查詢可見。快照隔離實(shí)現(xiàn)中的一個潛在問題是以原子方式用事務(wù)的所指派的提交時間戳來更新該事務(wù)中的多個不同行的版本時間戳。在版本創(chuàng)建時,包含版本時間戳通常只有在包含寫入事務(wù)在提交過程內(nèi)接收到其提交時間戳之后才能被正確且最終地設(shè)置。然而,如果寫入事務(wù)的版本被用其提交時間戳逐一更新,則這些版本中的一些可對另一快照可見,而其他的可能仍是不可見的。這種結(jié)果將不完全符合acid屬性中的原子性規(guī)則。為了避免關(guān)于可見性原子性的這個潛在異常,對于每個寫入事務(wù)可維護(hù)事務(wù)情境(transactioncontext)。當(dāng)寫入事務(wù)開始其第一個寫入操作時,創(chuàng)建事務(wù)情境條目。在特定示例中,所有創(chuàng)建的行版本在其版本頭部字段中存儲到事務(wù)情境條目的指針。在提交時,事務(wù)情境條目被用寫入事務(wù)的提交時間戳來更新,從而通過到該事務(wù)情境條目的指針對其他版本可用。在事務(wù)提交處理完成之后,在事務(wù)情境條目中寫入的提交時間戳被異步傳播到版本時間戳字段。該事務(wù)情境條目隨后可被進(jìn)行垃圾收集。利用對創(chuàng)建的版本的這種原子間接提交時間戳指派,在這個快照隔離實(shí)現(xiàn)下仍促進(jìn)了可見性原子性。圖4描繪了圖示出提供版本空間管理的事務(wù)情境的體系結(jié)構(gòu)400。體系結(jié)構(gòu)400包括存儲五個活躍時間戳12、13、15、16和19的快照時間戳存儲410。體系結(jié)構(gòu)400還包括用于四個活躍寫入事務(wù)t1、t2、t3、t4的事務(wù)情境存儲420,其中每一者具有其自己的事務(wù)情境條目。記錄鏈存儲430保持三個數(shù)據(jù)庫記錄,記錄1、記錄2和記錄3,每一者具有其自己的記錄版本435的版本鏈。每個記錄版本435包括版本時間戳440。如圖所示,從快照時間戳是12的快照的角度來看,v11和v21是可見的(因?yàn)樗鼈兊陌姹緯r間戳小于快照時間戳),但其他記錄版本435是不可見的。v13、v22和v33還不具有其版本時間戳,因?yàn)樗麄兊膶懭胧聞?wù)尚未被提交。版本v31和v32的時間戳大于快照時間戳(12),因此在快照中是不可見的。在此事務(wù)狀態(tài)下,記錄版本435存儲到相應(yīng)事務(wù)情境條目(t2和t3)的指針450。一旦例如t2提交,則事務(wù)管理器460的事務(wù)提交時間戳(如圖所示是19)此時被拷貝到事務(wù)情境條目420,從而間接提供可見性原子性。注意,圖4中的數(shù)據(jù)結(jié)構(gòu)是提供來給出概念性概覽的,但其實(shí)際實(shí)現(xiàn)可以是不同的。例如,取決于相應(yīng)的表格是行存儲還是列存儲——在單個數(shù)據(jù)庫系統(tǒng)中可支持這兩者,記錄版本的存儲布局可以是不同的。雖然讀取語句在本公開的至少某些實(shí)現(xiàn)方式中不獲取鎖定,但寫入事務(wù)通常獲取對其更新記錄的排它鎖以確保并發(fā)寫入操作的可串行化調(diào)度。如果記錄的最新版本在獲取排它記錄鎖之后對于快照不可見,則tsi下的事務(wù)可向終端用戶拋出錯誤。然而,ssi下的語句可被配置為通過用事務(wù)提交時間戳的較新值替代其語句時間戳來重啟該語句。在至少某些示例中,數(shù)據(jù)庫對象在鎖獲取和驗(yàn)證之后被最終更新。在另外的示例中,鎖表格根據(jù)其相應(yīng)表格的位置被分區(qū),或者與多節(jié)點(diǎn)死鎖檢測實(shí)現(xiàn)一起被分區(qū),以檢測在不同節(jié)點(diǎn)處執(zhí)行的寫入操作之間的依從性何時阻止事務(wù)提交。表1提供了可用于描述分布式數(shù)據(jù)庫事務(wù)協(xié)議的一組符號。表1:記號算法1示出了語句如何檢查記錄版本v是否應(yīng)當(dāng)對快照s可見(ssi下的語句或tsi下的事務(wù))。對于可見性判決,首先,檢查v的創(chuàng)建者事務(wù)的狀態(tài)。如果其是中止或活躍,則v對于s來說不應(yīng)當(dāng)可見(第8至11行)。如果其是已提交,則v的cid被與sts(s)相比較。僅當(dāng)sts(s)等于或大于v的cid時v對于s來說才可見(第3-7行)。算法1可見性判決算法:檢查記錄版本v對于快照s來說是否應(yīng)當(dāng)可見除了基本可見性規(guī)則以外,還提供以下擴(kuò)展。如前所述,以及如算法1中所記載,至少某些實(shí)現(xiàn)方式提供被預(yù)提交的語句或事務(wù)狀態(tài),其中語句或事務(wù)的最終提交被視為存疑,并且可見性判決被延遲直到存疑狀態(tài)被解決為止,例如通過語句或事務(wù)被提交來解決。如果v的狀態(tài)是預(yù)提交(第12至17行),則相應(yīng)記錄版本的可見性判決被延后。預(yù)提交/存疑狀態(tài)使得事務(wù)提交的子操作實(shí)際上是原子的,而不依賴于任何閉鎖(latch)或鎖定(lock)。延遲可見性判決方案可導(dǎo)致這樣的一種情形,即讀取語句可能需要等待另一寫入事務(wù)的提交完成。然而,這個等待情形通常是不常見的,因?yàn)槠浒l(fā)生在讀取語句嘗試檢查由與讀取嘗試同時提交的寫入事務(wù)創(chuàng)建的記錄版本的可見性時。為了進(jìn)一步降低讀取者等待存疑事務(wù)完成的可能性,所公開的分布式數(shù)據(jù)庫事務(wù)協(xié)議的特定實(shí)現(xiàn)方式可包括對于永遠(yuǎn)不會可見的記錄版本的早期剪除。如上文所說明的,事務(wù)的存疑時段是通過將事務(wù)的狀態(tài)設(shè)置為預(yù)提交而開始的。通過指派pcid,其中pcid通常被定義為小于以后要決定的其cid值,當(dāng)事務(wù)狀態(tài)被設(shè)置為預(yù)提交時,對于待處理的讀取者語句永遠(yuǎn)不會可見的記錄版本可被剪除,其中永遠(yuǎn)不會可見例如是因?yàn)椴樵兪潜葘懭氩僮鞲黹_始的,從而只應(yīng)當(dāng)查看在查詢開始時可用的記錄。更具體而言,如果sts(s)對于寫入事務(wù)t和快照s小于或等于pcid(t),則sts(s)將也小于cid(t),因?yàn)閜cid(t)小于由提交協(xié)議指派的cid(t)。從而,如果sts(s)≤pcid(t),則可判定被測試的版本v對于s來說不可見(算法1的第13至14行),而不再等待。示例5—在源節(jié)點(diǎn)處提交發(fā)起時的dml操作的同步如上所述,表格復(fù)制對于促進(jìn)分布式數(shù)據(jù)庫系統(tǒng)的實(shí)現(xiàn)可能是有用的。圖5a圖示了不包括數(shù)據(jù)復(fù)制的數(shù)據(jù)庫環(huán)境500。環(huán)境500包括應(yīng)用服務(wù)器505,該應(yīng)用服務(wù)器505與節(jié)點(diǎn)510通信,節(jié)點(diǎn)510充當(dāng)數(shù)據(jù)庫服務(wù)器并且容宿著表格1和表格2。應(yīng)用服務(wù)器505向節(jié)點(diǎn)510發(fā)送寫入請求515和讀取請求520。因?yàn)榄h(huán)境500包括單個節(jié)點(diǎn)510,所以環(huán)境500的性能與單個主機(jī)的資源綁定,從而在寫入請求515或讀取請求520的數(shù)目變得太大的情況下可能劣化。圖5b圖示了提供多個數(shù)據(jù)庫服務(wù)器節(jié)點(diǎn)535、540、545、550之間的數(shù)據(jù)的復(fù)制的環(huán)境525,其中每個節(jié)點(diǎn)與應(yīng)用服務(wù)器530通信并且容宿表格1(或者其拷貝)和表格2(或者其拷貝)。應(yīng)用服務(wù)器530向節(jié)點(diǎn)535發(fā)送寫入請求555,節(jié)點(diǎn)535存儲表格1和表格2的“源”版本。然而,應(yīng)用服務(wù)器530可向節(jié)點(diǎn)535、540、545、550的任何一者發(fā)送讀取請求560。發(fā)送到節(jié)點(diǎn)535的寫入請求555的結(jié)果被復(fù)制過程565傳播到節(jié)點(diǎn)540、545、550。因?yàn)楣?jié)點(diǎn)535是接收對于表格1和2的寫入請求555的唯一節(jié)點(diǎn)并且在節(jié)點(diǎn)535處對這些表格的改變被復(fù)制到其他節(jié)點(diǎn)540、545、550,所以節(jié)點(diǎn)535對于表格1和2充當(dāng)源節(jié)點(diǎn)。節(jié)點(diǎn)540、545、550對于表格1和2充當(dāng)副本節(jié)點(diǎn)。為了查詢處理和其他在線分析處理(olap)操作,圖5b的環(huán)境525與圖5a的環(huán)境500相比提供負(fù)載平衡,因?yàn)樽x取請求560可被發(fā)送到源節(jié)點(diǎn)535和副本節(jié)點(diǎn)540、545、550的任何一者。表格復(fù)制也可幫助數(shù)據(jù)庫系統(tǒng)避免低效率的跨節(jié)點(diǎn)聯(lián)接操作。圖6a圖示了具有應(yīng)用服務(wù)器605的數(shù)據(jù)庫系統(tǒng)600,該應(yīng)用服務(wù)器605與容宿表格1的數(shù)據(jù)庫服務(wù)器節(jié)點(diǎn)610和容宿表格2的數(shù)據(jù)庫服務(wù)器節(jié)點(diǎn)615通信。應(yīng)用服務(wù)器605對于表格1向節(jié)點(diǎn)610發(fā)送寫入請求620和讀取請求625。應(yīng)用服務(wù)器605對于表格2向節(jié)點(diǎn)615發(fā)送寫入請求620和讀取請求625。諸如sql聯(lián)接操作630之類的訪問表格1和2的操作必須訪問節(jié)點(diǎn)610和615兩者,這與只訪問一個數(shù)據(jù)庫服務(wù)器節(jié)點(diǎn)的操作相比可導(dǎo)致性能劣化。圖6b圖示了與環(huán)境600大體類似的替換環(huán)境635。然而,表格2被利用復(fù)制過程640從節(jié)點(diǎn)615復(fù)制到了節(jié)點(diǎn)610。諸如sql聯(lián)接操作630之類的訪問表格1和2兩者的只讀操作可簡單地被路由到節(jié)點(diǎn)610,從而通過幫助避免跨節(jié)點(diǎn)操作而改善了性能。如上所述,復(fù)制可被同步或異步地執(zhí)行。異步表格復(fù)制(asynchronoustablereplication,atr)可幫助減小由表格復(fù)制導(dǎo)致的性能劣化,但它實(shí)現(xiàn)和使用起來可能是復(fù)雜的。例如,因?yàn)閺?fù)制是異步的,所以副本表格與其源表格相比可具有過時的狀態(tài)。為了解決此問題,應(yīng)用開發(fā)者可能需要區(qū)分其在這種異步復(fù)本上運(yùn)行的工作負(fù)載或查詢,與那些只在源節(jié)點(diǎn)上或者在同步復(fù)制下操作的副本上運(yùn)行的工作負(fù)載或查詢。同步表格復(fù)制提供了更簡單的使用模型,因?yàn)樗械母北径寂c其源表格具有相同的狀態(tài)。然而,典型的同步表格復(fù)制實(shí)現(xiàn)方式向源事務(wù)添加了高性能開銷,尤其是考慮到以下兩個實(shí)現(xiàn)問題則更是如此。典型的同步表格復(fù)制協(xié)議對于每個dml語句將源表格與副本表格同步。同步表格復(fù)制以這種方式實(shí)現(xiàn)是因?yàn)橥皇聞?wù)中的后續(xù)讀取操作可嘗試從副本節(jié)點(diǎn)讀取數(shù)據(jù)變化。例如,圖7的事務(wù)執(zhí)行場景包括在源節(jié)點(diǎn)上對于事務(wù)t1執(zhí)行的dml操作dml1和dml2。查詢1應(yīng)當(dāng)能夠讀取dml1的結(jié)果,因?yàn)椴樵?和dml1都屬于同一事務(wù)t1。如果dml1被異步傳播到副本,則可能出現(xiàn)這樣的情況,即當(dāng)查詢1被分派到副本時,查詢1可能看不到dml1的執(zhí)行的結(jié)果,即使dml1是在源節(jié)點(diǎn)處作為同一事務(wù)的一部分執(zhí)行的。(例如,查詢1可在dml1之前到達(dá)副本節(jié)點(diǎn)。)雖然圖7的示例事務(wù)包括兩個dml語句,但一般而言,事務(wù)可包括任意數(shù)目的dml語句,數(shù)目最高可達(dá)取決于實(shí)現(xiàn)方式的閾值。另外,一般而言,事務(wù)可包括任意數(shù)目的查詢,數(shù)目最高可達(dá)取決于實(shí)現(xiàn)方式的閾值。另一個可劣化性能的實(shí)現(xiàn)問題源自于遵循源節(jié)點(diǎn)與其副本節(jié)點(diǎn)之間的完全兩階段提交協(xié)議來提交事務(wù)的典型同步表格復(fù)制。如圖8中所示的傳統(tǒng)兩階段提交協(xié)議在提交事務(wù)時涉及源節(jié)點(diǎn)與其每個副本節(jié)點(diǎn)之間的至少兩個網(wǎng)絡(luò)往返行程,如圖8的協(xié)議700中所示,其分別圖示了源節(jié)點(diǎn)704和副本節(jié)點(diǎn)708的執(zhí)行時間線706、710。dml語句dml1和dml2在方框714和724中在源節(jié)點(diǎn)704處被執(zhí)行。這些dml語句分別在通信716和726中被同步發(fā)送到副本節(jié)點(diǎn)708。dml1在過程718中在副本節(jié)點(diǎn)708處被執(zhí)行。dml2在過程728中在副本節(jié)點(diǎn)708處被執(zhí)行。在副本節(jié)點(diǎn)708處執(zhí)行dml1和dml2之后,副本節(jié)點(diǎn)708分別在通信720和730中向源節(jié)點(diǎn)704發(fā)送同步確認(rèn)。在圖8中,源節(jié)點(diǎn)704在執(zhí)行dml2之前等待對于dml1的同步確認(rèn)。與事務(wù)t1相關(guān)聯(lián)的查詢1在過程734中被源節(jié)點(diǎn)執(zhí)行。注意,查詢1是在dml1和dml2已在源節(jié)點(diǎn)704和副本節(jié)點(diǎn)708之間同步之后執(zhí)行的,并且從副本節(jié)點(diǎn)708接收了同步確認(rèn)。當(dāng)事務(wù)t1要被提交時,在步驟738中,源節(jié)點(diǎn)704通過發(fā)送同步準(zhǔn)備提交請求740來使副本708準(zhǔn)備提交事務(wù)。在接收到通知740后,副本節(jié)點(diǎn)708在方框742中準(zhǔn)備提交事務(wù),包括向持久性存儲寫入準(zhǔn)備提交日志并且在副本節(jié)點(diǎn)708處將該事務(wù)標(biāo)記為“存疑”。副本節(jié)點(diǎn)708隨后向源節(jié)點(diǎn)704發(fā)送同步準(zhǔn)備提交確認(rèn)744。當(dāng)源節(jié)點(diǎn)704接收到確認(rèn)744時,源節(jié)點(diǎn)704在方框748中對于該事務(wù)寫入提交日志,包括將該提交日志寫入到持久性存儲。源節(jié)點(diǎn)704在方框752中向副本節(jié)點(diǎn)708發(fā)送同步通知,或者提交請求754。當(dāng)通知754被副本節(jié)點(diǎn)708接收到時,副本節(jié)點(diǎn)708在方框756中對于該事務(wù)寫入提交日志,包括將該提交日志寫入到持久性存儲并且在副本節(jié)點(diǎn)708處將該事務(wù)標(biāo)記為“已提交”。副本節(jié)點(diǎn)708隨后向源節(jié)點(diǎn)704發(fā)送同步提交確認(rèn)758。在接收到提交確認(rèn)758后,源節(jié)點(diǎn)704在方框762中向客戶端(未示出)確認(rèn)提交。在傳統(tǒng)的兩階段提交協(xié)議700中,每一個dml語句的執(zhí)行要求源節(jié)點(diǎn)704和副本節(jié)點(diǎn)708之間的網(wǎng)絡(luò)往返行程。作為提交過程的一部分要求兩個額外的往返行程。這些網(wǎng)絡(luò)通信可延遲事務(wù)處理,并且可增大源節(jié)點(diǎn)704處的網(wǎng)絡(luò)和處理負(fù)擔(dān),這可能是不合需要的,尤其如果使用協(xié)議700的系統(tǒng)包括多個副本節(jié)點(diǎn)則更是如此。進(jìn)一步的延遲源自于系統(tǒng)在方框762中等待向客戶端確認(rèn)提交,直到寫入日志已在方框748、756中被寫入到源節(jié)點(diǎn)704和副本節(jié)點(diǎn)708兩者處的持久性存儲為止。這一節(jié)(示例5)中描述的示例提供了一種表格復(fù)制協(xié)議,其能夠消除或減小典型同步表格復(fù)制實(shí)現(xiàn)的性能開銷,同時仍提供向副本同步傳播更新。也就是說,源節(jié)點(diǎn)和副本節(jié)點(diǎn)處的操作的同步不晚于事務(wù)被源節(jié)點(diǎn)提交之時。在某些實(shí)現(xiàn)方式中,本文描述的表格復(fù)制協(xié)議可被應(yīng)用到對于給定的源表格包括多個副本節(jié)點(diǎn)的系統(tǒng)。此外,這些協(xié)議可被應(yīng)用到具有多個源節(jié)點(diǎn)的系統(tǒng),或者具有多個源節(jié)點(diǎn)和多個副本節(jié)點(diǎn)的系統(tǒng)。然而,為了論述的簡單,本公開繼續(xù)論述使用單個源節(jié)點(diǎn)和單個副本節(jié)點(diǎn)的示例。根據(jù)此示例5的一個方面,源節(jié)點(diǎn)處的事務(wù)的dml語句被異步傳播到副本節(jié)點(diǎn),但它們在事務(wù)在源節(jié)點(diǎn)處被提交時是同步的。圖9呈現(xiàn)了實(shí)現(xiàn)本公開的這個方面的示例協(xié)議800。實(shí)現(xiàn)協(xié)議800的系統(tǒng)具有源節(jié)點(diǎn)804和副本節(jié)點(diǎn)808,它們具有各自的執(zhí)行時間線806和810。在方框814中,由源節(jié)點(diǎn)804維護(hù)的表格1上的dml語句dml1在源節(jié)點(diǎn)804處被執(zhí)行。dml1被源節(jié)點(diǎn)804在通信816中異步發(fā)送到副本節(jié)點(diǎn)808。dml1在方框818處在副本節(jié)點(diǎn)808上被執(zhí)行。在過程822中,另一dml語句dml2在由源節(jié)點(diǎn)804維護(hù)的表格2上被執(zhí)行。dml2被源節(jié)點(diǎn)804在通信824中異步發(fā)送到副本節(jié)點(diǎn)808。dml2在方框826處在副本節(jié)點(diǎn)808上被執(zhí)行。因?yàn)橥ㄐ?16是異步的,所以源節(jié)點(diǎn)804在方框822中執(zhí)行dml2之前不需要從副本節(jié)點(diǎn)808接收關(guān)于在方框818中dml1的執(zhí)行完成的確認(rèn)。在可選的過程830中,作為與dml1和dml2相同的事務(wù)的一部分訪問表格1的查詢1在源節(jié)點(diǎn)804處被執(zhí)行。根據(jù)這個示例5的一些實(shí)現(xiàn)方式,當(dāng)查詢1是與dml1和dml2相同的事務(wù)的一部分時(所謂的讀取自己寫入(read-own-write)場景),即使該事務(wù)尚未被提交,并且dml1和dml2可能在副本節(jié)點(diǎn)808尚未被執(zhí)行,查詢1在源節(jié)點(diǎn)804處也是可執(zhí)行的。在一些示例中,當(dāng)被實(shí)現(xiàn)協(xié)議800的系統(tǒng)接收的事務(wù)中的查詢訪問被同一事務(wù)中的一個或多個dml語句更新的表格時,該查詢被數(shù)據(jù)庫客戶端直接發(fā)送到源節(jié)點(diǎn)804(步驟842)。在其他示例中,該查詢最初可被副本節(jié)點(diǎn)808接收,如可選方框834中所示。在此場景中,當(dāng)最初在副本節(jié)點(diǎn)808處被接收到時,查詢1等待直到同一事務(wù)中的待處理的dml語句dml1和dml2從源節(jié)點(diǎn)804異步到達(dá)并且在方框818和826中在副本節(jié)點(diǎn)808處被重放為止。一旦dml1和dml2已在副本節(jié)點(diǎn)808上執(zhí)行,查詢1就在可選方框838中在副本節(jié)點(diǎn)808處執(zhí)行。在一具體示例中,事務(wù)包括在dml語句被執(zhí)行時遞增的序列id值。如果查詢1當(dāng)最初被副本節(jié)點(diǎn)808接收時與比副本節(jié)點(diǎn)808當(dāng)前已知的序列id高的序列id相關(guān)聯(lián),則查詢1在副本節(jié)點(diǎn)808處的執(zhí)行可被延遲,直到副本節(jié)點(diǎn)808的序列id通過對與查詢1在同一事務(wù)中的更早dml語句的執(zhí)行而趕上查詢1的序列id為止。在其他實(shí)現(xiàn)方式中,副本節(jié)點(diǎn)808將查詢1轉(zhuǎn)發(fā)到源節(jié)點(diǎn)804,例如在可選的通信842中轉(zhuǎn)發(fā)。在特定示例中,查詢1的執(zhí)行被延遲,等待同一事務(wù)的dml1和dml2在副本節(jié)點(diǎn)808上的執(zhí)行。然而,如果超過了等待時間的某個預(yù)定閾值,則查詢1被副本節(jié)點(diǎn)808在通信842中重路由到源節(jié)點(diǎn)804,并且查詢1隨后在可選方框830處被源節(jié)點(diǎn)804執(zhí)行。該預(yù)定閾值可取決于特定實(shí)現(xiàn)方式并且可例如是約0.1毫秒、約0.25毫秒、約0.5毫秒、約0.75毫秒、約1毫秒、約1.5毫秒、約2毫秒、約5毫秒、約10毫秒或者約50毫秒,例如是0.1毫秒、0.25毫秒、0.5毫秒、0.75毫秒、1毫秒、1.5毫秒、2毫秒、5毫秒、10毫秒或50毫秒。在另外的實(shí)現(xiàn)方式中,該預(yù)定閾值可在約0.05毫秒到約50毫秒之間,約0.1毫秒到約10毫秒之間,約0.25毫秒到約5毫秒之間,約0.5毫秒到約2.5毫秒之間或者約0.1毫秒到約1毫秒之間,例如在0.05毫秒到50毫秒之間,0.1毫秒到10毫秒之間,0.25毫秒到5毫秒之間,0.5毫秒到2.5毫秒之間或者0.1毫秒到1毫秒之間。在其他實(shí)現(xiàn)方式中,該預(yù)定閾值具有某個其他值。實(shí)現(xiàn)協(xié)議800的數(shù)據(jù)庫環(huán)境通常被設(shè)計為規(guī)定例如查詢1這樣的查詢能夠看到在與該查詢相同的事務(wù)內(nèi)做出的改變(即,確保讀取自己寫入語義)。在特定示例中,對于事務(wù)維護(hù)更新的表格列表。每當(dāng)查詢開始時就檢查表格列表。如果查詢訪問在同一事務(wù)中改變的表格,則該查詢被路由到該表格的源節(jié)點(diǎn)804,或者查詢的執(zhí)行被延遲直到該事務(wù)的先前dml在目標(biāo)副本節(jié)點(diǎn)處被重放(replay)為止。在另一實(shí)現(xiàn)方式中,更新的表格列表被發(fā)送到客戶端庫的事務(wù)情境并且被緩存在該事務(wù)情境處。在查詢將會訪問在同一事務(wù)內(nèi)改變的表格的情況下,客戶端可將該查詢轉(zhuǎn)發(fā)到源節(jié)點(diǎn)804,而不是轉(zhuǎn)發(fā)到副本節(jié)點(diǎn)808。此實(shí)現(xiàn)方式不僅幫助避免了查詢訪問可能過時的數(shù)據(jù),而且它與讓查詢首先被發(fā)送到副本節(jié)點(diǎn)808只是為了之后被副本節(jié)點(diǎn)808發(fā)送到源節(jié)點(diǎn)804的情況相比可改善性能。在至少某些實(shí)現(xiàn)方式中,更新的表格列表對應(yīng)于用于獲取、檢查和釋放表格鎖的列表。例如,當(dāng)表格被事務(wù)更新時,其可在該列表上被標(biāo)記以便在該表格上獲取鎖,該鎖可以是與其他事務(wù)共享的鎖。因?yàn)樵摫砀褚呀?jīng)被記錄在列表上,所以同一列表可用于判定查詢是否將要訪問已在同一情境(事務(wù))內(nèi)更新的表格。從而,在至少某些示例中,本公開的這個方面可利用數(shù)據(jù)庫環(huán)境中的現(xiàn)有基礎(chǔ)設(shè)施以便促進(jìn)同步復(fù)制。在其他示例中,一單獨(dú)的列表可用于跟蹤什么表格被事務(wù)所更新,或者這些表格可以其他方式被指示為被事務(wù)所使用。例如,表格可被用一標(biāo)志標(biāo)記來指示出它們正被事務(wù)更新,或者可包括指示出什么事務(wù)當(dāng)前正更新該表格的字段。當(dāng)包括dml語句dml1和dml2的事務(wù)要在源節(jié)點(diǎn)804處被提交時,在方框846,源節(jié)點(diǎn)804向副本節(jié)點(diǎn)808發(fā)送同步準(zhǔn)備提交請求850。副本節(jié)點(diǎn)808在方框854中預(yù)提交該事務(wù),包括向持久性存儲寫入預(yù)提交日志并且在副本節(jié)點(diǎn)808處將該事務(wù)標(biāo)記為“存疑”。在替換實(shí)現(xiàn)方式中,事務(wù)在方框854中在副本節(jié)點(diǎn)808處被標(biāo)記為“存疑”,但預(yù)提交日志不被寫入到持久性存儲。在本公開的至少一些實(shí)現(xiàn)方式中,預(yù)提交日志條目與提交日志條目類似。在一具體示例中,預(yù)提交日志條目由寫入集合提取器316和日志生成器324生成,并且被日志發(fā)送器328發(fā)送,其方式類似于參考圖3對于源節(jié)點(diǎn)302處的寫入操作和提交操作描述的類似。在更具體的實(shí)現(xiàn)方式中,預(yù)提交日志條目除了dml語句被提交了這個事實(shí)外還可包括信息,例如時間戳。在特定示例中,該時間戳與預(yù)提交操作何時發(fā)生相關(guān)聯(lián)。在復(fù)制期間,當(dāng)操作被預(yù)提交時,其被使得對寫入日志重放器可用,例如并行寫入日志重放器344(圖3)。然而,改變不可被其他數(shù)據(jù)庫讀取者查看,直到整個事務(wù)被提交為止。在本公開的一方面中,一旦每個成分dml語句已被執(zhí)行并預(yù)提交,整個事務(wù)就可被提交。一旦事務(wù)已被副本節(jié)點(diǎn)808預(yù)提交,副本節(jié)點(diǎn)808就向源節(jié)點(diǎn)804發(fā)送同步確認(rèn)860。在接收到確認(rèn)860之后,源節(jié)點(diǎn)804在方框864中提交事務(wù),包括向持久性存儲寫入對于該事務(wù)的寫入日志。在提交該事務(wù)之后,源節(jié)點(diǎn)804在方框868中向副本節(jié)點(diǎn)808發(fā)送同步提交請求872。在接收到提交請求872之后,副本節(jié)點(diǎn)808在方框876中提交該事務(wù),包括向持久性存儲寫入提交日志并且在副本節(jié)點(diǎn)708處將該事務(wù)標(biāo)記為“已提交”。在提交該事務(wù)之后,副本節(jié)點(diǎn)808向源節(jié)點(diǎn)804發(fā)送同步提交確認(rèn)880,源節(jié)點(diǎn)804隨后在方框884中向客戶端(未示出)確認(rèn)該提交。圖9所示的協(xié)議800中的提交過程——包括如上所述的預(yù)提交和提交階段——與圖8所示的兩階段提交過程700大體類似。應(yīng)當(dāng)明白,從源節(jié)點(diǎn)804向副本節(jié)點(diǎn)808異步發(fā)送dml語句可與其他提交方案結(jié)合使用。例如,示例6描述了可與向副本節(jié)點(diǎn)異步發(fā)送dml語句結(jié)合使用的替換提交協(xié)議。通過將示例5與示例6的提交方案相結(jié)合而獲得的協(xié)議在示例7中描述。在圖9中,在準(zhǔn)備提交請求850和確認(rèn)860之間的準(zhǔn)備提交步驟中的同步往返行程期間,副本節(jié)點(diǎn)將副本側(cè)事務(wù)標(biāo)記為存疑。如果被狀態(tài)為存疑的事務(wù)改變的數(shù)據(jù)被該事務(wù)外的查詢(讀取操作)所訪問,則查詢執(zhí)行被推遲,直到該事務(wù)的狀態(tài)被改變?yōu)橐烟峤换蛑兄篂橹埂H绻聞?wù)要在源節(jié)點(diǎn)804處被提交,而不將副本側(cè)事務(wù)標(biāo)記為存疑,則有可能剛好在該事務(wù)在源節(jié)點(diǎn)804處被提交之后在副本節(jié)點(diǎn)808處開始的查詢(在該事務(wù)之外)可能看不到在副本側(cè)該事務(wù)的結(jié)果??山Y(jié)合示例5使用的適當(dāng)可見性方案在示例4中描述。利用此示例5的協(xié)議可改善數(shù)據(jù)庫性能,因?yàn)樗粫τ诿恳粋€dml語句要求源節(jié)點(diǎn)804和副本節(jié)點(diǎn)808之間的同步。預(yù)提交過程可用作整個事務(wù)的同步點(diǎn),這與典型的同步復(fù)制協(xié)議不同,典型的同步復(fù)制協(xié)議對于提交過程要求兩個同步點(diǎn),并且對于事務(wù)中的每個dml語句要求額外的同步點(diǎn)。如果希望,如圖9所示,協(xié)議800可包括額外的同步點(diǎn),例如在提交過程期間(提交請求872和確認(rèn)880)。在提交過程期間使用額外的同步點(diǎn)在某些復(fù)制場景中可能是有用的,例如當(dāng)副本節(jié)點(diǎn)不是被用于負(fù)載平衡而是被用于“高可用性數(shù)據(jù)”目的時或者除了被用于負(fù)載平衡以外還被用于“高可用性數(shù)據(jù)”目的時。如果希望,源節(jié)點(diǎn)804和副本節(jié)點(diǎn)808之間的通信可被分組以進(jìn)一步減輕網(wǎng)絡(luò)通信對于在源節(jié)點(diǎn)804處提交事務(wù)或者在副本節(jié)點(diǎn)808上預(yù)提交或提交事務(wù)所需要的時間的影響。例如,并發(fā)的預(yù)提交請求850或并發(fā)的提交請求872可被源節(jié)點(diǎn)804分組成單個物理網(wǎng)絡(luò)調(diào)用。類似地,來自副本節(jié)點(diǎn)808的預(yù)提交確認(rèn)860或提交確認(rèn)880可被分組成單個物理網(wǎng)絡(luò)調(diào)用。在圖9中,雖然dml語句被異步傳播到副本節(jié)點(diǎn),但副本節(jié)點(diǎn)808處的預(yù)提交操作854(其將事務(wù)t1標(biāo)記為存疑)不會執(zhí)行,直到該事務(wù)的所有dml語句在副本節(jié)點(diǎn)808處被重放為止。該事務(wù)在源節(jié)點(diǎn)804處不提交,直到該事務(wù)在副本節(jié)點(diǎn)808處被預(yù)提交為止。從而,與完全異步復(fù)制相比,此示例5的協(xié)議可潛在增大事務(wù)提交延時。然而,在實(shí)踐中,延時的這個增大可能不會出現(xiàn),或者可能不是顯著的。例如,如圖9中那樣,如果事務(wù)中的讀取查詢(例如方框830中對查詢1的執(zhí)行)跟隨在同一事務(wù)中的dml語句之后(例如,方框822中的源節(jié)點(diǎn)804上的dml2執(zhí)行),則很有可能在正常執(zhí)行的過程中,復(fù)制的dml語句將在查詢1正在方框830中在源節(jié)點(diǎn)804處被執(zhí)行的同時在副本節(jié)點(diǎn)808處被重放(在方框826中)。另外,在許多典型的客戶端/服務(wù)器數(shù)據(jù)庫應(yīng)用模型中,在執(zhí)行事務(wù)中的dml語句之后,dml執(zhí)行結(jié)果經(jīng)由網(wǎng)絡(luò)調(diào)用被提供給客戶端(未示出)。由于這個客戶端/服務(wù)器通信可與源節(jié)點(diǎn)804和副本節(jié)點(diǎn)808之間的網(wǎng)絡(luò)通信重疊,所以到方框846、850、854、860中的預(yù)提交處理之時,復(fù)制的dml語句可能已經(jīng)在副本節(jié)點(diǎn)808處被重放。在dml語句的執(zhí)行結(jié)果在執(zhí)行之后(并且在事務(wù)提交之前)被確認(rèn)給客戶端的上述場景中,作為異步dml復(fù)制的結(jié)果,副本節(jié)點(diǎn)808處的dml重放期間的差錯將在源節(jié)點(diǎn)804處的dml操作的完成已經(jīng)被確認(rèn)給客戶端之后被檢測到。然而,因?yàn)椴铄e最遲將在提交事務(wù)之前被檢測到,所以如果在事務(wù)在副本節(jié)點(diǎn)808處重放期間發(fā)生差錯則事務(wù)可被安全地回滾。圖10a呈現(xiàn)了根據(jù)此示例5的一實(shí)現(xiàn)方式在源節(jié)點(diǎn)處發(fā)生的動作的方法900的流程圖。在方法900中,事務(wù)的一個或多個數(shù)據(jù)庫操作被源節(jié)點(diǎn)異步發(fā)送到副本節(jié)點(diǎn),并且源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間的同步通信被用于在副本節(jié)點(diǎn)處預(yù)提交事務(wù)。參考圖10a,在步驟905中,源節(jié)點(diǎn)在由源節(jié)點(diǎn)維護(hù)的至少一個數(shù)據(jù)庫表格上執(zhí)行數(shù)據(jù)庫操作。當(dāng)在本文使用時,術(shù)語數(shù)據(jù)庫表格指的是數(shù)據(jù)庫的任何部分,無論是如何組織的。數(shù)據(jù)庫操作可例如是與事務(wù)相關(guān)聯(lián)的dml語句。方法900可被應(yīng)用到維護(hù)多個表格的源節(jié)點(diǎn)。類似地,方法900可被應(yīng)用到包括多個數(shù)據(jù)庫操作的事務(wù),或者包括數(shù)據(jù)庫操作之前和/或之后的一個或多個查詢的事務(wù)。在步驟910中,源節(jié)點(diǎn)將數(shù)據(jù)庫操作——例如dml語句——異步發(fā)送到副本節(jié)點(diǎn)。副本節(jié)點(diǎn)復(fù)制源節(jié)點(diǎn)的至少一個表格,但可復(fù)制源節(jié)點(diǎn)的多個表格。此外,數(shù)據(jù)庫系統(tǒng)可包括多個源節(jié)點(diǎn),并且副本節(jié)點(diǎn)可復(fù)制來自第一源節(jié)點(diǎn)的一個或多個表格和來自第二源節(jié)點(diǎn)的一個或多個表格。對于該事務(wù)中的任何額外數(shù)據(jù)庫操作,源節(jié)點(diǎn)可反復(fù)重復(fù)步驟905和910。在可選的步驟915中,源節(jié)點(diǎn)接收與該數(shù)據(jù)庫操作在同一事務(wù)中的查詢。在一個示例中,該查詢是從數(shù)據(jù)庫客戶端接收的。在另一示例中,該查詢是從副本節(jié)點(diǎn)接收的。例如,當(dāng)客戶端判定該查詢將訪問在與該查詢相同的事務(wù)中改變的表格時,該查詢可被客戶端發(fā)送到源節(jié)點(diǎn),而不是副本節(jié)點(diǎn)。類似地,例如當(dāng)副本節(jié)點(diǎn)判定該查詢將訪問在與該查詢相同的事務(wù)內(nèi)改變的表格時,該查詢可被副本節(jié)點(diǎn)發(fā)送到源節(jié)點(diǎn)。或者,副本節(jié)點(diǎn)可首先延遲該查詢在副本節(jié)點(diǎn)處的執(zhí)行,等待該查詢所依從的dml語句的執(zhí)行,然后如果該延遲超過了預(yù)定的閾值時間則將該查詢轉(zhuǎn)發(fā)到源節(jié)點(diǎn)。在可選的步驟920中,如果查詢被源節(jié)點(diǎn)接收到(訪問被與該查詢相同的事務(wù)所改變的表格的查詢,例如讀取該事務(wù)中的數(shù)據(jù)庫操作的結(jié)果),則源節(jié)點(diǎn)執(zhí)行該查詢。源節(jié)點(diǎn)在步驟925中向副本節(jié)點(diǎn)發(fā)送同步請求以準(zhǔn)備提交事務(wù)。在步驟930中,源節(jié)點(diǎn)接收來自副本節(jié)點(diǎn)的同步預(yù)提交確認(rèn),指出事務(wù)在副本節(jié)點(diǎn)處被預(yù)提交,例如指出該事務(wù)中的dml語句在副本節(jié)點(diǎn)處被成功執(zhí)行了。源節(jié)點(diǎn)在步驟935中提交該數(shù)據(jù)庫操作。在步驟940中,在源節(jié)點(diǎn)處提交該事務(wù)之后,源節(jié)點(diǎn)向客戶端確認(rèn)該提交。在特定示例中(例如參見以下的示例6和7),在源節(jié)點(diǎn)處提交事務(wù)之后,源節(jié)點(diǎn)向客戶端提供確認(rèn),而不等待來自副本節(jié)點(diǎn)的對于該事務(wù)被副本節(jié)點(diǎn)提交了的確認(rèn)。例如,源節(jié)點(diǎn)可在源節(jié)點(diǎn)處提交事務(wù)之后,但是在向客戶端發(fā)送提交確認(rèn)之前或之后向副本節(jié)點(diǎn)發(fā)送異步提交請求。在這種示例中,在向數(shù)據(jù)庫客戶端提供確認(rèn)之前,源節(jié)點(diǎn)不等待來自副本節(jié)點(diǎn)的對于事務(wù)被副本節(jié)點(diǎn)提交了的確認(rèn)。在其他示例中(例如像圖9的協(xié)議800中那樣),到客戶端的確認(rèn)是在源節(jié)點(diǎn)接收到來自副本節(jié)點(diǎn)的提交確認(rèn)之后發(fā)送的。例如,在源節(jié)點(diǎn)處提交事務(wù)之后,源節(jié)點(diǎn)可向副本節(jié)點(diǎn)發(fā)送同步提交請求并且在接收到來自副本節(jié)點(diǎn)的同步提交確認(rèn)之后提交該事務(wù)。圖10b提供了表示在此示例5的至少某些實(shí)現(xiàn)方式期間在副本節(jié)點(diǎn)處發(fā)生的動作的方法950的流程圖。在方法950中,由源節(jié)點(diǎn)異步發(fā)送的事務(wù)的一個或多個數(shù)據(jù)庫操作被副本節(jié)點(diǎn)接收,并且源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間的同步通信被用于在副本節(jié)點(diǎn)處預(yù)提交事務(wù)。在步驟955中,副本節(jié)點(diǎn)接收從源節(jié)點(diǎn)異步發(fā)送來的數(shù)據(jù)庫操作。例如,數(shù)據(jù)庫操作可以是來自包括一個或多個數(shù)據(jù)庫操作(例如,dml語句)并且可選地包括數(shù)據(jù)庫操作之前和/或之后的一個或多個查詢的事務(wù)的dml語句。在可選的步驟960中,副本節(jié)點(diǎn)例如從數(shù)據(jù)庫客戶端接收事務(wù)中的查詢,其中該查詢訪問由與該查詢相同的事務(wù)改變的表格。在特定實(shí)現(xiàn)方式中,副本節(jié)點(diǎn)檢查該查詢是否讀取同一事務(wù)中的數(shù)據(jù)庫操作的結(jié)果,并且如果是,則在可選的步驟965中向源節(jié)點(diǎn)發(fā)送該查詢。例如,當(dāng)副本節(jié)點(diǎn)判定該查詢訪問在與該查詢相同的事務(wù)中改變的表格時,副本節(jié)點(diǎn)可將該查詢轉(zhuǎn)發(fā)到源節(jié)點(diǎn)。在另一示例中,副本節(jié)點(diǎn)檢查該查詢是否讀取同一事務(wù)中的數(shù)據(jù)庫操作的結(jié)果,并且如果是,則首先延遲該查詢的執(zhí)行,等待該事務(wù)中其結(jié)果將被該查詢訪問的(一個或多個)數(shù)據(jù)庫操作(例如,(一個或多個)dml語句)的執(zhí)行。如果該延遲超過預(yù)定的閾值時間,則副本節(jié)點(diǎn)在可選的步驟965中將該查詢發(fā)送到源節(jié)點(diǎn)。在步驟970中,副本節(jié)點(diǎn)在至少一個數(shù)據(jù)庫表格的拷貝(副本)上執(zhí)行該數(shù)據(jù)庫操作,例如dml語句。對于該事務(wù)中的任何額外數(shù)據(jù)庫操作,副本節(jié)點(diǎn)可反復(fù)重復(fù)步驟955和970。在可選的步驟975中,副本節(jié)點(diǎn)執(zhí)行與這(一個或多個)數(shù)據(jù)庫操作在同一事務(wù)中的查詢,例如其執(zhí)行被延遲(在檢查該查詢是否讀取數(shù)據(jù)庫操作的結(jié)果之后)等待在步驟970中數(shù)據(jù)庫操作的執(zhí)行的查詢。在步驟980中,副本節(jié)點(diǎn)接收來自源節(jié)點(diǎn)的同步預(yù)提交請求。副本節(jié)點(diǎn)在步驟985中預(yù)提交該事務(wù),例如將該事務(wù)的(一個或多個)數(shù)據(jù)庫操作寫入到持久性存儲中的預(yù)提交日志。作為預(yù)提交一部分,該事務(wù)可被副本節(jié)點(diǎn)標(biāo)記為“存疑”。在另一實(shí)現(xiàn)方式中,在步驟985中,該事務(wù)在副本節(jié)點(diǎn)處被標(biāo)記為“存疑”,但該事務(wù)不被寫入到持久性存儲中的預(yù)提交日志。在步驟990中,副本節(jié)點(diǎn)向源節(jié)點(diǎn)發(fā)送同步預(yù)提交確認(rèn),指出該事務(wù)被副本節(jié)點(diǎn)成功預(yù)提交了,包括例如指出事務(wù)中的dml語句被副本節(jié)點(diǎn)成功執(zhí)行了。方法950可包括額外的步驟。在一個實(shí)現(xiàn)方式中,副本節(jié)點(diǎn)接收來自源節(jié)點(diǎn)的異步提交請求或提交通知。副本節(jié)點(diǎn)在接收到提交請求之后提交數(shù)據(jù)庫操作,例如包括一個或多個dml語句的事務(wù)。例如,副本節(jié)點(diǎn)將關(guān)于該事務(wù)的提交日志寫入到持久性存儲并且將該事務(wù)標(biāo)記為已提交。在另一實(shí)現(xiàn)方式中,副本節(jié)點(diǎn)接收來自源節(jié)點(diǎn)的同步提交請求或提交通知。副本節(jié)點(diǎn)提交該事務(wù)。例如,副本節(jié)點(diǎn)將關(guān)于該事務(wù)的提交日志寫入到持久性存儲并且將該事務(wù)標(biāo)記為已提交。在事務(wù)被提交之后,副本節(jié)點(diǎn)向源節(jié)點(diǎn)發(fā)送同步提交確認(rèn),指出該事務(wù)被副本節(jié)點(diǎn)成功提交了。示例6—副本節(jié)點(diǎn)處的樂觀提交當(dāng)復(fù)制被用于“高可用性數(shù)據(jù)”目的時,通常將使用傳統(tǒng)的兩階段提交,或者提交時的源節(jié)點(diǎn)和副本節(jié)點(diǎn)的持久性存儲的嚴(yán)格同步。這是因?yàn)椋诟呖捎眯詳?shù)據(jù)應(yīng)用中,即使源節(jié)點(diǎn)變得不可用,副本節(jié)點(diǎn)也應(yīng)當(dāng)能夠繼續(xù)服務(wù)客戶端讀取請求,以及可能有寫入請求。然而,當(dāng)表格復(fù)制被用于其他目的時,例如用于負(fù)載平衡(圖5b),可以使用樂觀方案,因?yàn)闊o需完全等待副本節(jié)點(diǎn)處的日志持久性i/o就可以決定源事務(wù)的提交。在一些實(shí)現(xiàn)方式中,取決于表格復(fù)制是用于高可用性數(shù)據(jù)(樂觀提交模式關(guān)閉)還是用于負(fù)載平衡(樂觀提交模式開啟),提交事務(wù)的樂觀方案可被選擇性地啟用(開啟或關(guān)閉)。例如,即使副本節(jié)點(diǎn)在將其提交日志寫入到持久性存儲之前崩潰,其也可簡單地在重新激活時與源節(jié)點(diǎn)處的源表格重新同步,因?yàn)樘峤坏娜罩疽呀?jīng)在事務(wù)提交之前被安全地寫入在源節(jié)點(diǎn)處。參考圖11的協(xié)議1000來描述這個樂觀提交協(xié)議。在圖11的協(xié)議中,用于事務(wù)的一個或多個數(shù)據(jù)庫操作被從源節(jié)點(diǎn)復(fù)制到副本節(jié)點(diǎn),并且在源節(jié)點(diǎn)不等待接收來自副本節(jié)點(diǎn)的提交確認(rèn)的情況下,向數(shù)據(jù)庫客戶端確認(rèn)該事務(wù)為已提交。如圖所示,協(xié)議1000可遵循典型的同步復(fù)制協(xié)議,其中具有各自的執(zhí)行時間線1006的源節(jié)點(diǎn)1004和副本節(jié)點(diǎn)1008在每一個dml語句之后是同步的。然而,如果希望,此示例6的樂觀提交協(xié)議可結(jié)合其他dml復(fù)制方案使用。例如,此示例6的樂觀提交協(xié)議可與示例5的異步dml復(fù)制協(xié)議相結(jié)合。這種結(jié)合在下文中在示例7中描述。源節(jié)點(diǎn)1004和副本節(jié)點(diǎn)1008執(zhí)行事務(wù)的一個或多個數(shù)據(jù)庫操作。例如,如圖11所示,用于事務(wù)t1的分別在表格1和2上的dml語句dml1和dml2在方框1014、1024中在源節(jié)點(diǎn)1004處被執(zhí)行。這些dml語句分別在通信1016和1026中被從源節(jié)點(diǎn)1004同步發(fā)送到副本節(jié)點(diǎn)1008。dml1在過程1018中在副本節(jié)點(diǎn)1008處被執(zhí)行。dml2在方框1028中在副本節(jié)點(diǎn)1008處被執(zhí)行。在副本節(jié)點(diǎn)1008處執(zhí)行dml1和dml2之后,副本節(jié)點(diǎn)1008分別在通信1020和1030中向源節(jié)點(diǎn)1004發(fā)送同步確認(rèn)。當(dāng)事務(wù)t1要被提交時,在方框1038中,源節(jié)點(diǎn)1004通過發(fā)送同步預(yù)提交請求1040來使副本1008準(zhǔn)備提交事務(wù)。在接收到預(yù)提交請求1040之后,副本節(jié)點(diǎn)1008在方框1042中使事務(wù)準(zhǔn)備預(yù)提交,包括在副本節(jié)點(diǎn)1008處將該事務(wù)標(biāo)記為“存疑”。在一些實(shí)現(xiàn)方式中,方框1042可包括向持久性存儲寫入預(yù)提交日志。在方框1042之后,副本節(jié)點(diǎn)1008向源節(jié)點(diǎn)1004發(fā)送同步預(yù)提交確認(rèn)1044。在預(yù)提交請求1040正被發(fā)送,并且副本節(jié)點(diǎn)1008正在方框1042中預(yù)提交事務(wù)期間,源節(jié)點(diǎn)1004繼續(xù)在方框1038中提交事務(wù)。也就是說,與提交過程1038相關(guān)聯(lián)的i/o開銷(用于源節(jié)點(diǎn)1004處的持久性操作)與同步預(yù)提交請求1040的網(wǎng)絡(luò)開銷重疊,可選地與方框1042中副本節(jié)點(diǎn)1008的預(yù)提交過程的預(yù)提交i/o開銷(用于副本節(jié)點(diǎn)1008處的本地持久性操作)重疊,并且與同步預(yù)提交確認(rèn)1044的網(wǎng)絡(luò)開銷重疊。如果希望,源節(jié)點(diǎn)1004和副本節(jié)點(diǎn)1008之間的通信可被分組以進(jìn)一步減輕網(wǎng)絡(luò)通信對于在源節(jié)點(diǎn)1004處提交事務(wù)或者在副本節(jié)點(diǎn)1008上預(yù)提交或提交事務(wù)所需要的時間的影響。例如,并發(fā)的預(yù)提交請求1040可被源節(jié)點(diǎn)1004分組成單個物理網(wǎng)絡(luò)調(diào)用。類似地,來自副本節(jié)點(diǎn)1008的預(yù)提交確認(rèn)1044可被分組成單個物理網(wǎng)絡(luò)調(diào)用。在源節(jié)點(diǎn)1004已在方框1038中提交了事務(wù),并且從副本節(jié)點(diǎn)1008接收到了預(yù)提交確認(rèn)1044之后,源節(jié)點(diǎn)1004在方框1048中向客戶端(未示出)確認(rèn)提交。隨后,在方框1052中,源節(jié)點(diǎn)1004向副本節(jié)點(diǎn)1008發(fā)送異步提交請求1054。當(dāng)異步提交請求1054被副本節(jié)點(diǎn)1008接收到時,副本節(jié)點(diǎn)1008在方框1056中對于該事務(wù)寫入提交日志,包括將該提交日志寫入到持久性存儲并且在副本節(jié)點(diǎn)1008處將該事務(wù)標(biāo)記為“已提交”。在其他實(shí)現(xiàn)方式中,異步提交請求1054被源節(jié)點(diǎn)1004在方框1048中向客戶端提供提交確認(rèn)之前發(fā)送或者與提供提交確認(rèn)并行地發(fā)送。與使用圖8的協(xié)議700的系統(tǒng),或者使用圖9的協(xié)議800的系統(tǒng)相比,使用圖11的協(xié)議1000的系統(tǒng)向客戶端提供了事務(wù)提交的更早確認(rèn),因?yàn)槠涫窃跊]有由協(xié)議700和800在最終同步提交階段中招致的往返通信和日志持久性延遲的情況下發(fā)生的。一旦事務(wù)被源節(jié)點(diǎn)1004提交,這些改變就對訪問源節(jié)點(diǎn)1004的讀取者可用。這些改變在其被副本節(jié)點(diǎn)1008提交之后可被副本節(jié)點(diǎn)1008訪問。如上所述,副本節(jié)點(diǎn)1008處的事務(wù)由于預(yù)提交過程1042而被標(biāo)記為存疑。如果事務(wù)要在源節(jié)點(diǎn)1004處被提交,而不將副本側(cè)事務(wù)標(biāo)記為存疑,則有可能剛好在該事務(wù)在源節(jié)點(diǎn)1008處被提交之后在副本節(jié)點(diǎn)1004處開始的查詢(在該事務(wù)之外)可能看不到在副本側(cè)該事務(wù)的結(jié)果??山Y(jié)合示例6使用的適當(dāng)可見性方案在示例4中描述。在圖11的協(xié)議1000中,如果查詢(在該事務(wù)之外)在副本節(jié)點(diǎn)1008處開始預(yù)提交處理之前被副本節(jié)點(diǎn)1008接收,則諸如dml1和dml2之類的數(shù)據(jù)庫操作的改變對于查詢來說是不可見的,因?yàn)樗鼈兊膶?yīng)事務(wù)狀態(tài)仍被標(biāo)記為活躍。(此場景不同于像示例5中那樣處理同事務(wù)查詢,在示例5中副本節(jié)點(diǎn)處的查詢首先被檢查以判定其是否將訪問在與該查詢相同的事務(wù)中改變的表格。如果是,則該查詢可被發(fā)送到源節(jié)點(diǎn),或者在副本節(jié)點(diǎn)處延遲執(zhí)行直到相應(yīng)的數(shù)據(jù)庫操作(例如,dml語句)已在副本節(jié)點(diǎn)處被執(zhí)行為止。)在圖11的示例中,對于在副本節(jié)點(diǎn)1008處接收的訪問當(dāng)前事務(wù)的經(jīng)修改的記錄的當(dāng)前事務(wù)之外的查詢,副本節(jié)點(diǎn)1008將等待,直到事務(wù)的狀態(tài)被從活躍或存疑(對于當(dāng)前事務(wù))改變成已提交或中止,然后執(zhí)行該查詢(在當(dāng)前事務(wù)之外),而不是讀取可能過時的數(shù)據(jù)?;蛘撸绻北竟?jié)點(diǎn)1008判定查詢(在當(dāng)前事務(wù)之外)將訪問被標(biāo)記為存疑(對于當(dāng)前事務(wù))的記錄,則副本節(jié)點(diǎn)1008可將該查詢轉(zhuǎn)發(fā)到源節(jié)點(diǎn)1004來執(zhí)行?;蛘?,副本節(jié)點(diǎn)1008可在等待事務(wù)變得已提交或中止達(dá)預(yù)定閾值時間之后轉(zhuǎn)發(fā)查詢。圖12提供了描述根據(jù)此示例6的一實(shí)現(xiàn)方式在源節(jié)點(diǎn)處發(fā)生的動作的方法1100的流程圖。在方法1100中,事務(wù)的一個或多個數(shù)據(jù)庫操作在數(shù)據(jù)庫環(huán)境內(nèi)被從源節(jié)點(diǎn)復(fù)制到副本節(jié)點(diǎn),并且在源節(jié)點(diǎn)不等待接收來自副本節(jié)點(diǎn)的提交確認(rèn)的情況下,向數(shù)據(jù)庫客戶端確認(rèn)該事務(wù)為已提交。在步驟1105中,在由源節(jié)點(diǎn)維護(hù)的至少一個數(shù)據(jù)庫表格上執(zhí)行至少一個數(shù)據(jù)庫操作。當(dāng)在本文使用時,術(shù)語數(shù)據(jù)庫表格指的是數(shù)據(jù)庫的任何部分,無論是如何組織的。例如,數(shù)據(jù)庫操作可以是包括一個或多個dml語句的事務(wù)中的一dml語句。事務(wù)也可包括一個或多個查詢。在一些示例中,源節(jié)點(diǎn)維護(hù)多個表格,并且這些表格中的一個或多個可被復(fù)制到一個或多個副本節(jié)點(diǎn)。在一些情況中,所有的副本節(jié)點(diǎn)都復(fù)制源節(jié)點(diǎn)的相同的一個或多個表格。在其他情況中,不同的副本節(jié)點(diǎn)復(fù)制不同的源節(jié)點(diǎn)表格。在步驟1110中,源節(jié)點(diǎn)將該數(shù)據(jù)庫操作發(fā)送到副本節(jié)點(diǎn)。例如,源節(jié)點(diǎn)將該數(shù)據(jù)庫操作同步發(fā)送到副本節(jié)點(diǎn)。在此情況下,源節(jié)點(diǎn)在通過執(zhí)行下一數(shù)據(jù)庫操作或預(yù)提交(一個或多個)數(shù)據(jù)庫操作而繼續(xù)之前等待關(guān)于副本節(jié)點(diǎn)已執(zhí)行了該數(shù)據(jù)庫操作的確認(rèn)。對于該事務(wù)中的任何額外數(shù)據(jù)庫操作,源節(jié)點(diǎn)可反復(fù)重復(fù)步驟1105和1110。源節(jié)點(diǎn)在步驟1115中向副本節(jié)點(diǎn)發(fā)送同步預(yù)提交請求。副本節(jié)點(diǎn)執(zhí)行預(yù)提交操作(例如,如上文參考圖11所述),然后向源節(jié)點(diǎn)發(fā)送同步預(yù)提交確認(rèn)。源節(jié)點(diǎn)在步驟1120中接收來自副本節(jié)點(diǎn)的同步預(yù)提交確認(rèn)。事務(wù)在步驟1125中被源節(jié)點(diǎn)提交,例如如上文參考圖11所述。在步驟1130中,在源節(jié)點(diǎn)處提交該事務(wù)之后,源節(jié)點(diǎn)向數(shù)據(jù)庫客戶端發(fā)送提交確認(rèn),確認(rèn)該事務(wù)的提交。在可選的步驟1135中,在源節(jié)點(diǎn)處提交該事務(wù)之后,源節(jié)點(diǎn)向副本節(jié)點(diǎn)發(fā)送異步提交請求。雖然圖12示出了步驟1135在步驟1130之后發(fā)生,但在至少一些示例中,步驟1135可在步驟1130之前發(fā)生或者與步驟1130并行發(fā)生。在這種示例中,在向數(shù)據(jù)庫客戶端提供確認(rèn)之前,源節(jié)點(diǎn)不等待來自副本節(jié)點(diǎn)的對于事務(wù)被副本節(jié)點(diǎn)提交了的確認(rèn)。在可選的步驟1140中,第二數(shù)據(jù)庫操作被源節(jié)點(diǎn)執(zhí)行,例如訪問被先前提交的數(shù)據(jù)庫操作所改變的記錄的數(shù)據(jù)庫操作。例如,第二數(shù)據(jù)庫操作可在源節(jié)點(diǎn)沒有接收來自副本節(jié)點(diǎn)的提交通知的情況下被執(zhí)行。示例7–在源節(jié)點(diǎn)處的提交發(fā)起和副本節(jié)點(diǎn)處的樂觀提交時帶有dml操作的同步的復(fù)制如果希望,示例5和6的協(xié)議可被結(jié)合,如圖13的協(xié)議1200中所示。實(shí)現(xiàn)協(xié)議1200的系統(tǒng)包括源節(jié)點(diǎn)1204和副本節(jié)點(diǎn)1208,它們具有各自的執(zhí)行時間線1206、1210。在過程1214中,表格1上的dml語句dml1在源節(jié)點(diǎn)1204處被執(zhí)行,然后在通信1216中被異步發(fā)送到副本節(jié)點(diǎn)1208。在方框1218中,dml1在副本節(jié)點(diǎn)1208上被執(zhí)行。表格2上的另一dml語句dml2在方框1222中在源節(jié)點(diǎn)1204處被執(zhí)行,然后在通信1224中被異步發(fā)送到副本節(jié)點(diǎn)1208。dml2在過程1226中在副本節(jié)點(diǎn)1208處被執(zhí)行。在可選的方框1230中,作為與dml1和dml2相同的事務(wù)的一部分的查詢1在源節(jié)點(diǎn)1204處被執(zhí)行。如上文針對示例5所述,在一些情況中,查詢1是由源節(jié)點(diǎn)1204直接從數(shù)據(jù)庫客戶端接收的。在其他示例中,查詢1被副本節(jié)點(diǎn)1208轉(zhuǎn)發(fā)到源節(jié)點(diǎn)1204。例如,副本節(jié)點(diǎn)1208在可選的方框1234中接收查詢1。在一些情況中,當(dāng)副本節(jié)點(diǎn)1208判定查詢將會訪問在與該查詢相同的事務(wù)中修改的表格時,副本節(jié)點(diǎn)1208例如在可選的通信1238中將該查詢轉(zhuǎn)發(fā)到源節(jié)點(diǎn)1204。在其他示例中,查詢可首先被副本節(jié)點(diǎn)1208扣住,等待副本節(jié)點(diǎn)1208執(zhí)行同一事務(wù)中該查詢所依從的dml語句。在副本節(jié)點(diǎn)1208執(zhí)行這些dml語句后,副本節(jié)點(diǎn)1208可例如在可選的過程1242中處理處理該查詢。在其他示例中,如果查詢在副本節(jié)點(diǎn)1208處等待了超過預(yù)定閾值的時間,則該查詢被副本節(jié)點(diǎn)1208在可選的通信1238中轉(zhuǎn)發(fā)到源節(jié)點(diǎn)1204。源節(jié)點(diǎn)1204隨后在可選的方框1230中執(zhí)行該同事務(wù)查詢。該預(yù)定閾值可取決于特定實(shí)現(xiàn)方式并且可例如是約0.1毫秒、約0.25毫秒、約0.5毫秒、約0.75毫秒、約1毫秒、約1.5毫秒、約2毫秒、約5毫秒、約10毫秒或者約50毫秒,例如是0.1毫秒、0.25毫秒、0.5毫秒、0.75毫秒、1毫秒、1.5毫秒、2毫秒、5毫秒、10毫秒或50毫秒。在另外的實(shí)現(xiàn)方式中,該預(yù)定閾值可在約0.05毫秒到約50毫秒之間,約0.1毫秒到約10毫秒之間,約0.25毫秒到約5毫秒之間,約0.5毫秒到約2.5毫秒之間或者約0.1毫秒到約1毫秒之間,例如在0.05毫秒到50毫秒之間,0.1毫秒到10毫秒之間,0.25毫秒到5毫秒之間,0.5毫秒到2.5毫秒之間或者0.1毫秒到1毫秒之間。在其他實(shí)現(xiàn)方式中,該預(yù)定閾值具有某個其他值。協(xié)議1200可提供對查詢和dml語句的改善的處理,因?yàn)閿?shù)據(jù)庫操作被異步傳播。例如,源節(jié)點(diǎn)1204可執(zhí)行dml2,而無需等待dml1與副本節(jié)點(diǎn)1208同步。類似地,查詢1可被源節(jié)點(diǎn)1204執(zhí)行,而無需等待dml1和dml2與副本節(jié)點(diǎn)1208的同步。在方框1246,源節(jié)點(diǎn)1204準(zhǔn)備提交包括dml1、dml2和查詢1的事務(wù)。源節(jié)點(diǎn)1204在通信1250中向副本節(jié)點(diǎn)1208發(fā)送同步準(zhǔn)備提交請求。副本節(jié)點(diǎn)1208在方框1254中預(yù)提交該事務(wù),將該事務(wù)在副本節(jié)點(diǎn)1208處標(biāo)記為“存疑”。在一些實(shí)現(xiàn)方式中,方框1254可包括讓副本節(jié)點(diǎn)1208向持久性存儲寫入預(yù)提交日志。副本節(jié)點(diǎn)1208在通信1260中向源節(jié)點(diǎn)1204發(fā)送同步預(yù)提交確認(rèn)。在通信1250、1260和預(yù)提交過程1254正在發(fā)生的時段期間,源節(jié)點(diǎn)1204在方框1246中寫入提交日志。使源1204處對寫入日志的寫入與副本節(jié)點(diǎn)1208處的預(yù)提交過程重疊可幫助減小由復(fù)制過程招致的延遲。如果希望,源節(jié)點(diǎn)1204和副本節(jié)點(diǎn)1208之間的通信可被分組以進(jìn)一步減輕網(wǎng)絡(luò)通信對于在源節(jié)點(diǎn)1204處提交事務(wù)或者在副本節(jié)點(diǎn)1208上預(yù)提交或提交事務(wù)所需要的時間的影響。例如,并發(fā)的預(yù)提交請求1250可被源節(jié)點(diǎn)1204分組成單個物理網(wǎng)絡(luò)調(diào)用。類似地,來自副本節(jié)點(diǎn)1240的預(yù)提交確認(rèn)1260可被分組成單個物理網(wǎng)絡(luò)調(diào)用。來自源節(jié)點(diǎn)1204的異步提交請求1272(下文描述)可被類似地分組來發(fā)送到副本節(jié)點(diǎn)1208。在方框1264中,在提交過程1246已在源節(jié)點(diǎn)1204處完成,并且源節(jié)點(diǎn)1204已接收到來自副本節(jié)點(diǎn)1208的同步預(yù)提交確認(rèn)1260之后,源節(jié)點(diǎn)1204向客戶端(未示出)確認(rèn)該事務(wù)的提交。在過程1268中,源節(jié)點(diǎn)1204使副本節(jié)點(diǎn)1208準(zhǔn)備提交事務(wù),包括通過在通信1272中發(fā)送異步提交請求。在一些示例中,方框1268發(fā)生在方框1264中向客戶端確認(rèn)提交之前或者與其并行發(fā)生。副本節(jié)點(diǎn)1208在方框1276中提交該事務(wù),包括通過向持久性存儲寫入提交日志并且在副本節(jié)點(diǎn)1208處將該事務(wù)標(biāo)記為“已提交”。除了通過不在每一個dml事務(wù)要求同步來加快源節(jié)點(diǎn)處的事務(wù)處理以外,協(xié)議1200還可通過包括單個同步點(diǎn)(預(yù)提交過程、通信1250和1260)作為事務(wù)提交過程的一部分來改善復(fù)制性能。此過程還允許了使事務(wù)的結(jié)果在源節(jié)點(diǎn)1204處可用(對于同一事務(wù)中或該事務(wù)之外的查詢),而無需等待該事務(wù)在副本節(jié)點(diǎn)1208處被完全提交。當(dāng)事務(wù)被副本節(jié)點(diǎn)1208提交時,可在副本節(jié)點(diǎn)1208處使復(fù)制的數(shù)據(jù)對于該事務(wù)之外的查詢可用。因?yàn)楦北竟?jié)點(diǎn)1208將dml語句標(biāo)記為存疑直到該事務(wù)被提交為止,并且因?yàn)槿绻撌聞?wù)中的較早改變的結(jié)果不可見則該事務(wù)之外的查詢不會在副本節(jié)點(diǎn)1208上執(zhí)行,所以不會有讀取請求從副本節(jié)點(diǎn)1208獲得過時數(shù)據(jù)的危險。圖14a呈現(xiàn)了根據(jù)此示例7的一實(shí)現(xiàn)方式在源節(jié)點(diǎn)處發(fā)生的動作的方法1300的流程圖。在方法1300中,事務(wù)的一個或多個數(shù)據(jù)庫操作被從源節(jié)點(diǎn)異步發(fā)送到副本節(jié)點(diǎn),源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間的同步通信被用于在副本節(jié)點(diǎn)處預(yù)提交事務(wù),并且該事務(wù)被向數(shù)據(jù)庫客戶端確認(rèn)為已提交,而無需源節(jié)點(diǎn)等待接收來自副本節(jié)點(diǎn)的提交確認(rèn)。在步驟1308中,源節(jié)點(diǎn)在由源節(jié)點(diǎn)維護(hù)的至少一個數(shù)據(jù)庫表格上執(zhí)行數(shù)據(jù)庫操作。當(dāng)在本文使用時,術(shù)語數(shù)據(jù)庫表格指的是數(shù)據(jù)庫的任何部分,無論是如何組織的。數(shù)據(jù)庫操作可例如是與事務(wù)相關(guān)聯(lián)的dml語句。方法1300可被應(yīng)用到維護(hù)多個表格的源節(jié)點(diǎn)。類似地,方法1300可被應(yīng)用到包括多個數(shù)據(jù)庫操作的事務(wù),或者包括數(shù)據(jù)庫操作之前和/或之后的一個或多個查詢的事務(wù)。在步驟1310中,源節(jié)點(diǎn)將數(shù)據(jù)庫操作——例如dml語句——異步發(fā)送到副本節(jié)點(diǎn)。副本節(jié)點(diǎn)復(fù)制源節(jié)點(diǎn)的至少一個表格,但可復(fù)制源節(jié)點(diǎn)的多個表格。此外,數(shù)據(jù)庫系統(tǒng)可包括多個源節(jié)點(diǎn),并且副本節(jié)點(diǎn)可復(fù)制來自第一源節(jié)點(diǎn)的一個或多個表格和來自第二源節(jié)點(diǎn)的一個或多個表格。對于該事務(wù)中的任何額外數(shù)據(jù)庫操作,源節(jié)點(diǎn)可反復(fù)重復(fù)步驟1305和1310。在可選的步驟1312中,源節(jié)點(diǎn)接收與該數(shù)據(jù)庫操作在同一事務(wù)中的查詢。在一個示例中,該查詢是從數(shù)據(jù)庫客戶端接收的。在另一示例中,該查詢是從副本節(jié)點(diǎn)接收的。例如,當(dāng)客戶端判定該查詢將訪問在與該查詢相同的事務(wù)中改變的表格時,該查詢可被客戶端發(fā)送到源節(jié)點(diǎn),而不是副本節(jié)點(diǎn)。類似地,例如當(dāng)副本節(jié)點(diǎn)判定該查詢將訪問在與該查詢相同的事務(wù)內(nèi)改變的表格時,該查詢可被副本節(jié)點(diǎn)發(fā)送到源節(jié)點(diǎn)?;蛘?,副本節(jié)點(diǎn)可首先延遲該查詢在副本節(jié)點(diǎn)處的執(zhí)行,等待該查詢所依從的dml語句的執(zhí)行,然后如果該延遲超過了預(yù)定的閾值時間則將該查詢轉(zhuǎn)發(fā)到源節(jié)點(diǎn)。在可選的步驟1314中,如果查詢被源節(jié)點(diǎn)接收到(訪問被與該查詢相同的事務(wù)所改變的表格的查詢,例如讀取該事務(wù)中的數(shù)據(jù)庫操作的結(jié)果),則源節(jié)點(diǎn)執(zhí)行該查詢。源節(jié)點(diǎn)在步驟1316中向副本節(jié)點(diǎn)發(fā)送同步請求以準(zhǔn)備提交事務(wù)。在步驟1318中,源節(jié)點(diǎn)接收來自副本節(jié)點(diǎn)的同步預(yù)提交確認(rèn),指出事務(wù)在副本節(jié)點(diǎn)處被預(yù)提交了,例如指出該事務(wù)中的dml語句在副本節(jié)點(diǎn)處被成功執(zhí)行了。源節(jié)點(diǎn)在步驟1320中提交該數(shù)據(jù)庫操作。在步驟1322中,在源節(jié)點(diǎn)處提交該事務(wù)之后,源節(jié)點(diǎn)向客戶端確認(rèn)該提交。在特定示例中,在源節(jié)點(diǎn)處提交事務(wù)之后,源節(jié)點(diǎn)向客戶端提供確認(rèn),而不等待來自副本節(jié)點(diǎn)的對于該事務(wù)被副本節(jié)點(diǎn)提交了的確認(rèn)。例如,源節(jié)點(diǎn)可在向客戶端發(fā)送提交確認(rèn)之后在步驟1324中向副本節(jié)點(diǎn)發(fā)送異步提交請求。雖然步驟1324被示為在步驟1322中向數(shù)據(jù)庫客戶端提供確認(rèn)之后發(fā)生,但在其他示例中,步驟1324可在步驟1322之前發(fā)生或與步驟1322并行發(fā)生。圖14b提供了表示在此示例7的至少某些實(shí)現(xiàn)方式期間在副本節(jié)點(diǎn)處發(fā)生的動作的方法1330的流程圖。在方法1330中,從源節(jié)點(diǎn)異步發(fā)送到副本節(jié)點(diǎn)的一個或多個數(shù)據(jù)庫操作被副本節(jié)點(diǎn)接收,源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間的同步通信被用于在副本節(jié)點(diǎn)處預(yù)提交事務(wù),并且事務(wù)被向數(shù)據(jù)庫客戶端確認(rèn)為已提交,而無需源節(jié)點(diǎn)等待接收來自副本節(jié)點(diǎn)的提交確認(rèn)。在步驟1332中,副本節(jié)點(diǎn)接收從源節(jié)點(diǎn)異步發(fā)送來的數(shù)據(jù)庫操作。例如,數(shù)據(jù)庫操作可以是來自包括一個或多個數(shù)據(jù)庫操作(例如,dml語句)并且可選地包括數(shù)據(jù)庫操作之前和/或之后的一個或多個查詢的事務(wù)的dml語句。在可選的步驟1334中,副本節(jié)點(diǎn)例如從數(shù)據(jù)庫客戶端接收事務(wù)中的查詢,其中該查詢訪問由與該查詢相同的事務(wù)改變的表格。在特定實(shí)現(xiàn)方式中,副本節(jié)點(diǎn)檢查該查詢是否讀取同一事務(wù)中的數(shù)據(jù)庫操作的結(jié)果,并且如果是,則在可選的步驟1336中向源節(jié)點(diǎn)發(fā)送該查詢。例如,當(dāng)副本節(jié)點(diǎn)判定該查詢訪問在與該查詢相同的事務(wù)中改變的表格時,副本節(jié)點(diǎn)可將該查詢轉(zhuǎn)發(fā)到源節(jié)點(diǎn)。在另一示例中,副本節(jié)點(diǎn)檢查該查詢是否讀取同一事務(wù)中的數(shù)據(jù)庫操作的結(jié)果,并且如果是,則首先延遲該查詢的執(zhí)行,等待該事務(wù)中其結(jié)果將被該查詢訪問的(一個或多個)數(shù)據(jù)庫操作(例如,(一個或多個)dml語句)的執(zhí)行。如果該延遲超過預(yù)定的閾值時間,則副本節(jié)點(diǎn)在可選的步驟1336中將該查詢發(fā)送到源節(jié)點(diǎn)。在步驟1338中,副本節(jié)點(diǎn)在至少一個數(shù)據(jù)庫表格的拷貝(副本)上執(zhí)行該數(shù)據(jù)庫操作,例如dml語句。對于該事務(wù)中的任何額外數(shù)據(jù)庫操作,副本節(jié)點(diǎn)可反復(fù)重復(fù)步驟1332和1338。在可選的步驟1340中,副本節(jié)點(diǎn)執(zhí)行與這(一個或多個)數(shù)據(jù)庫操作在同一事務(wù)中的查詢,例如其執(zhí)行被延遲(在檢查該查詢是否讀取數(shù)據(jù)庫操作的結(jié)果之后)等待在步驟1338中數(shù)據(jù)庫操作的執(zhí)行的查詢。在步驟1342中,副本節(jié)點(diǎn)接收來自源節(jié)點(diǎn)的同步預(yù)提交請求。副本節(jié)點(diǎn)在步驟1344中預(yù)提交該事務(wù),例如作為由副本節(jié)點(diǎn)進(jìn)行的預(yù)提交的一部分將該事務(wù)標(biāo)記為“存疑”。在一些實(shí)現(xiàn)方式中,步驟1344可包括將該事務(wù)的(一個或多個)數(shù)據(jù)庫操作寫入到副本節(jié)點(diǎn)的持久性存儲中的預(yù)提交日志。在步驟1346中,副本節(jié)點(diǎn)向源節(jié)點(diǎn)發(fā)送同步預(yù)提交確認(rèn),指出該事務(wù)被副本節(jié)點(diǎn)成功預(yù)提交了,包括例如指出事務(wù)中的dml語句被副本節(jié)點(diǎn)成功執(zhí)行了。在步驟1348中,副本節(jié)點(diǎn)接收來自源節(jié)點(diǎn)的異步提交請求。副本節(jié)點(diǎn)在步驟1350中提交該數(shù)據(jù)庫操作。例如,副本節(jié)點(diǎn)將關(guān)于該事務(wù)的提交日志寫入到持久性存儲并且將該事務(wù)標(biāo)記為已提交。示例8—在表格復(fù)制重激活時維持跨表格事務(wù)一致性本公開的某些示例可涉及在復(fù)制——例如在示例6中描述的在副本節(jié)點(diǎn)處具有樂觀提交的同步表格復(fù)制——已被激活或重激活之后使副本系統(tǒng)與源系統(tǒng)同步,例如,在一些情形中,表格復(fù)制可被手動解除激活(例如為了執(zhí)行維護(hù))并且隨后被重激活,或者可由于在表格復(fù)制期間發(fā)生的例外而被重啟。圖15圖示了如果表格被允許逐表格地遞增式重激活則可能發(fā)展出來的潛在問題。圖15圖示了系統(tǒng)1400,其具有包含表格1和2的源系統(tǒng)1410和包含表格1和2的拷貝的副本系統(tǒng)1420,這些表格正被遞增地同步。在源系統(tǒng)1410中,對表格1和表格2的改變在同步被解除激活之后已累積了。副本系統(tǒng)1420表明對于表格1的同步者已完成了提交對表格1’的改變,但對于表格2’的同步者仍在工作。如果副本系統(tǒng)1420在此時被訪問,則表格1’和表格2’之間的聯(lián)接操作可返回不一致的數(shù)據(jù)(與源系統(tǒng)1410處的表格1和表格2之間的相同聯(lián)接操作相比)。圖16a提供了用于在表格復(fù)制的激活或重激活之后的重同步期間輔助維持由副本系統(tǒng)接收的讀取操作中的一致性的示例方法1500的流程圖。在步驟1510中,阻止復(fù)制日志重放,例如在示例1-7中描述的過程。在特定實(shí)現(xiàn)方式中,日志條目繼續(xù)被源系統(tǒng)生成,并且可被發(fā)送到副本系統(tǒng),即使日志條目被阻止被副本系統(tǒng)重放。為了解決重激活時段期間的這個潛在不一致的問題,源系統(tǒng)和副本系統(tǒng)可利用單個內(nèi)部事務(wù)重激活表格。這樣,在重激活期間應(yīng)用的改變可對于所有復(fù)制的表格同時變得可見。在并行多線程過程中,源節(jié)點(diǎn)中的每個表格在步驟1515中被鎖定。在步驟1520中,在并行多線程過程中,復(fù)制日志生成在每個源表格處被重激活。源表格在步驟1525中在并行多線程過程中被解除鎖定。在步驟1530中獲取快照時間戳。步驟1525和1530的順序在方法1500的一些實(shí)現(xiàn)方式中可被顛倒。在步驟1535中,副本表格與源表格選擇性地同步。如上所述,在這個過程期間,副本日志可被(一個或多個)源節(jié)點(diǎn)生成,并且如果希望可被發(fā)送到(一個或多個)適當(dāng)副本節(jié)點(diǎn)。然而,副本日志尚未被重放。同步可以任何適當(dāng)?shù)姆绞綀?zhí)行。在一個具體示例中,同步是通過將每個源表格和其副本表格的行id值(如示例3中所述)相比較來執(zhí)行的。如果行id值在源表格中存在,但在副本表格中不存在,則記錄被拷貝到副本表格。如果行id值在副本表格中存在,但在源表格中不存在,則具有該行id值的記錄被從副本表格去除。如果行id值在源表格和副本表格中存在,則不采取動作。利用在步驟1530中獲取的時間戳執(zhí)行同步(例如,利用時間戳來選擇對于復(fù)制日志重放忽略哪些事務(wù),而改為利用同步來恢復(fù))。從而,例如,對于具有不晚于同步時間戳的事務(wù)提交時間戳的任何事務(wù),在表格的拷貝(副本表格)和源表格之間同步記錄。在步驟1540中,復(fù)制日志重放的繼續(xù)開始在源主機(jī)處對于復(fù)制的數(shù)據(jù)庫表格的拷貝發(fā)起。在各種實(shí)現(xiàn)方式中,發(fā)起是由源系統(tǒng)、副本系統(tǒng)或者與副本系統(tǒng)通信的另一系統(tǒng)執(zhí)行的。在復(fù)制日志重放期間,日志條目(寫入日志和事務(wù)提交日志)僅在操作的時間戳晚于在步驟1525中獲取的同步時間戳發(fā)生的情況下被重放。有利地,這可幫助防止事務(wù)被執(zhí)行多次,或者錯過的日志被播放,即使同步過程已經(jīng)對復(fù)制的表格做出了適當(dāng)?shù)母淖?。圖16b提供了至少部分由副本主機(jī)實(shí)現(xiàn)的同步操作的方法1550。在步驟1555中,副本主機(jī)接收同步時間戳。在步驟1560中,至少部分基于該同步時間戳,在副本主機(jī)處復(fù)制的數(shù)據(jù)庫表格的拷貝選擇性地與源數(shù)據(jù)庫表格同步。在步驟1565中,至少部分基于該同步時間戳,復(fù)制日志重放在副本主機(jī)處繼續(xù)開始。例如,副本主機(jī)對于具有不早于該同步時間戳的更新時間戳或者具有晚于該同步時間戳的相應(yīng)事務(wù)提交時間戳的任何條目,執(zhí)行dml重放器日志的條目。副本主機(jī)也可對于晚于該同步時間戳的任何事務(wù)提交時間戳執(zhí)行事務(wù)日志的任何條目。如方法1550中所述,對于復(fù)制的表格阻止副本日志重放,直到同步過程完成為止。在至少一個實(shí)現(xiàn)方式中,在同步期間,復(fù)制的表格在同步正被執(zhí)行期間仍可接收讀取請求。然而,讀取請求將看到表格的未同步版本,因此不同表格上的聯(lián)接操作仍將在與彼此一致的表格版本上操作(雖然它們與源表格中可用的數(shù)據(jù)相比可能是過時的)。一旦同步完成,聯(lián)接操作就將能夠訪問表格的同步版本。圖17提供了系統(tǒng)1600的示圖,圖示了副本節(jié)點(diǎn)的dml和事務(wù)日志隊(duì)列1605、1610,圖示了圖17的方法1600可如何輔助避免多個日志重放或錯過的日志的重放。dml日志隊(duì)列1605被示為具有多個dml語句1620、1630、1640、1650,并且事務(wù)日志隊(duì)列被示為具有多個事務(wù)提交操作1625、1635、1645、1655。在圖16中,箭頭指示寫入操作與其相應(yīng)的事務(wù)提交操作之間的關(guān)系。在此示例中,副本表格和源表格以等于11的時間戳1615同步。在圖17的方法1600的一個方面中,如果關(guān)聯(lián)的時間戳大于或等于同步時間戳1615,則寫入操作被重放,因?yàn)槟切┱Z句將在同步完成之后發(fā)生。如果提交操作的時間戳大于同步時間戳1615,則寫入操作也被重放,即使寫入操作本身的時間戳小于同步時間戳。注意,在示例實(shí)現(xiàn)方式中,寫入操作的時間戳始終小于其相應(yīng)事務(wù)提交操作的時間戳。寫入操作1620和1630將不被重放,因?yàn)樗鼈兊膶懭霑r間戳小于11并且它們的提交時間戳不大于11。寫入操作1640將被重放,即使其寫入時間戳小于11,因?yàn)槠涮峤徊僮?645的時間戳大于11。寫入操作1650將被重放,因?yàn)槠鋵懭霑r間戳大于11。事務(wù)提交操作被重放,如果其時間戳大于同步時間戳的話。在圖17的示例中,對于tx條目1645和tx1655的事務(wù)提交操作被重放。在一具體實(shí)現(xiàn)方式中,如果寫入操作的時間戳小于同步時間戳,則寫入操作被扣住,直到相應(yīng)的提交日志被接收并分析為止。如上所述,如果提交操作的時間戳小于同步時間戳,則寫入操作不被重放。如果提交時間戳大于同步時間戳,則寫入操作被重放。這樣,事務(wù)由同步時間戳來劃分。一些更新(較早的更新)是通過同步進(jìn)行的復(fù)制,而其他更新(較晚的更新,或者從大約獲取同步時間戳的時間起的更新)通過復(fù)制日志的回放被復(fù)制。避免了錯過的事務(wù)和事務(wù)的雙重回放。另外,由于同步時間戳實(shí)際上定義了單個內(nèi)部事務(wù),所以讀取者看到表格的一致視圖(全都被更新或者全都未被更新)。示例9—替換場景在上述的許多示例中,單個源節(jié)點(diǎn)與單個副本節(jié)點(diǎn)復(fù)制數(shù)據(jù)庫表格。更一般而言,本文描述的協(xié)議可用于源節(jié)點(diǎn)和n個副本節(jié)點(diǎn)之間的1對n復(fù)制,其中n是2或更多,n個副本節(jié)點(diǎn)的每一者存儲數(shù)據(jù)庫表格的拷貝(副本)。在一些實(shí)現(xiàn)方式中,n是20、50、100或更多個節(jié)點(diǎn)。該協(xié)議也可用于n對1復(fù)制,其中分布式源系統(tǒng)的至少一部分(例如一個或多個選擇的表格,或者其一些部分)具有多個源節(jié)點(diǎn)并且被復(fù)制到單個副本節(jié)點(diǎn)。該協(xié)議也可結(jié)合m-n復(fù)制使用,其中分布式源系統(tǒng)的至少一部分(例如一個或多個選擇的表格,或者其一些部分)被復(fù)制到多個副本節(jié)點(diǎn)。在上述的許多示例中,在源節(jié)點(diǎn)和副本節(jié)點(diǎn)之間復(fù)制數(shù)據(jù)庫表格。如上所述,術(shù)語數(shù)據(jù)庫表格指的是數(shù)據(jù)庫的任何部分,無論是如何組織的。這樣,本文描述的協(xié)議可用于系統(tǒng)(全數(shù)據(jù)庫的)復(fù)制,其中“數(shù)據(jù)庫表格”實(shí)際上是整個數(shù)據(jù)庫系統(tǒng)。類似地,當(dāng)“數(shù)據(jù)庫表格”是整個數(shù)據(jù)庫系統(tǒng)的限定部分時,例如數(shù)據(jù)庫系統(tǒng)中的多個表格之一,則這些協(xié)議也可逐表格地應(yīng)用。在這個情境中,表格復(fù)制可逐表格地選擇性應(yīng)用,使得一些表格被復(fù)制,而其他的不被復(fù)制。在另外的實(shí)現(xiàn)方式中,數(shù)據(jù)庫表格可被分區(qū),例如被分區(qū)在多個源節(jié)點(diǎn)、多個副本節(jié)點(diǎn)或者多個源節(jié)點(diǎn)和多個副本節(jié)點(diǎn)之間。在一些情況中,源節(jié)點(diǎn)和副本節(jié)點(diǎn)的一者或兩者持有表格的一分區(qū),另一者持有整個表格。在其他情況中,源和副本都持有表格的分區(qū),這些分區(qū)可以是相同或不同的。在上述的許多示例中,源節(jié)點(diǎn)與副本節(jié)點(diǎn)復(fù)制數(shù)據(jù)。術(shù)語“源節(jié)點(diǎn)”和“副本節(jié)點(diǎn)”表示在表格復(fù)制過程中的角色。取決于配置,給定的節(jié)點(diǎn)對于一些表格復(fù)制操作(例如,對于第一表格或第一組表格)可以是源節(jié)點(diǎn)并且對于其他表格復(fù)制操作(例如,對于第二表格或第二組表格)可以是副本節(jié)點(diǎn)。示例10—計算系統(tǒng)圖18描繪了適當(dāng)?shù)挠嬎阆到y(tǒng)1700的一般化示例,其中可實(shí)現(xiàn)描述的創(chuàng)新。計算系統(tǒng)1700并不打算暗示對于本公開的使用范圍或功能的任何限制,因?yàn)檫@些創(chuàng)新可在多種多樣的通用或?qū)S糜嬎阆到y(tǒng)中實(shí)現(xiàn)。參考圖18,計算系統(tǒng)1700包括一個或多個處理單元1710、1715和存儲器1720、1725。在圖18中,這個基本配置1730被包括在虛線內(nèi)。處理單元1710、1715執(zhí)行計算機(jī)可執(zhí)行指令。處理單元可以是通用中央處理單元(centralprocessingunit,cpu)、專用集成電路(application-specificintegratedcircuit,asic)中的處理器或者任何其他類型的處理器。在多處理系統(tǒng)中,多個處理單元執(zhí)行計算機(jī)可執(zhí)行指令來增大處理力。例如,圖18示出了中央處理單元1710以及圖形處理單元或協(xié)處理單元1715。有形存儲器1720、1725可以是可由(一個或多個)處理單元訪問的易失性存儲器(例如,寄存器、緩存、ram)、非易失性存儲器(例如,rom、eeprom、閃存等等)或者兩者的某種組合。存儲器1720、1725以適合于由(一個或多個)處理單元1710、1715執(zhí)行的計算機(jī)可執(zhí)行指令的形式存儲實(shí)現(xiàn)本文描述的一個或多個創(chuàng)新的軟件1780。計算系統(tǒng)1700可具有額外的特征。例如,計算系統(tǒng)1700包括存儲裝置1740、一個或多個輸入設(shè)備1750、一個或多個輸出設(shè)備1760和一個或多個通信連接1770。諸如總線、控制器或網(wǎng)絡(luò)之類的互連機(jī)制(未示出)互聯(lián)計算系統(tǒng)1700的組件。通常,操作系統(tǒng)軟件(未示出)為在計算系統(tǒng)1700中執(zhí)行的其他軟件提供操作環(huán)境,并且協(xié)調(diào)計算系統(tǒng)1700的組件的活動。有形存儲裝置1740可以是可移除或不可移除的,并且包括磁盤、磁帶或盒式磁帶、cd-rom、dvd或者可用于以非暫態(tài)方式存儲信息并且可在計算系統(tǒng)1700內(nèi)被訪問的任何其他介質(zhì)。計算系統(tǒng)1700存儲用于軟件1780實(shí)現(xiàn)本文描述的一個或多個創(chuàng)新的指令。(一個或多個)輸入設(shè)備1750可以是諸如鍵盤、鼠標(biāo)、筆或軌跡球之類的觸摸輸入設(shè)備、語音輸入設(shè)備、掃描設(shè)備或者向計算系統(tǒng)1700提供輸入的另一設(shè)備。(一個或多個)輸出設(shè)備1760可以是顯示器、打印機(jī)、揚(yáng)聲器、刻錄機(jī)或者從計算系統(tǒng)1700提供輸出的另一設(shè)備。(一個或多個)通信連接1770使得能夠通過通信介質(zhì)與另一計算實(shí)體通信。通信介質(zhì)以經(jīng)調(diào)制的數(shù)據(jù)信號的形式輸送諸如計算機(jī)可執(zhí)行指令、音頻或視頻輸入或輸出或者其他數(shù)據(jù)之類的信息。經(jīng)調(diào)制的數(shù)據(jù)信號可以是如下信號:該信號的特性中的一個或多個被以在該信號中編碼信息的方式來設(shè)置或改變。作為示例而非限制,通信介質(zhì)可使用電的、光的、rf或其他載體。可在計算機(jī)可執(zhí)行指令(例如程序模塊中包括的那些)在目標(biāo)真實(shí)或虛擬處理器上的計算系統(tǒng)中執(zhí)行的一般情境中描述創(chuàng)新。一般而言,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、庫、對象、類、組件、數(shù)據(jù)結(jié)構(gòu)等等。根據(jù)各種實(shí)施例中的需要,程序模塊的功能可被組合或分割在程序模塊之間。用于程序模塊的計算機(jī)可執(zhí)行指令可在本地或分布式計算系統(tǒng)內(nèi)執(zhí)行。術(shù)語“系統(tǒng)”和“設(shè)備”在本文中被可互換地使用。除非上下文明確地另有指示,否則兩個術(shù)語都不暗示對計算系統(tǒng)或計算設(shè)備的類型的任何限制。一般地,計算系統(tǒng)或計算設(shè)備可以是本地的或分布式的,并且可包括專用硬件和/或通用硬件與實(shí)現(xiàn)本文描述的功能的軟件的任何組合。為了演示起見,詳細(xì)描述使用像“判定”和“使用”這樣的術(shù)語來描述計算系統(tǒng)中的計算機(jī)操作。這些術(shù)語是對計算機(jī)執(zhí)行的操作的高級別抽象,并且不應(yīng)當(dāng)與人類執(zhí)行的動作混淆。與這些術(shù)語相對應(yīng)的實(shí)際計算機(jī)操作依據(jù)實(shí)現(xiàn)方式而有所變化。示例11—云計算環(huán)境圖19描繪了描述的技術(shù)可在其中實(shí)現(xiàn)的示例云計算環(huán)境1800。云計算環(huán)境1800包括云計算服務(wù)1810。云計算服務(wù)1810可包括各種類型的云計算資源,例如計算機(jī)服務(wù)器、數(shù)據(jù)存儲倉庫、聯(lián)網(wǎng)資源,等等。云計算服務(wù)1810可位于中央(例如,由企業(yè)或組織的數(shù)據(jù)中心提供)或者是分布式的(例如,由位于不同位置的各種計算資源提供,例如不同的數(shù)據(jù)中心和/或位于不同的城市或國家)。云計算服務(wù)1810被各種類型的計算設(shè)備(例如,客戶端計算設(shè)備)所利用,例如計算設(shè)備1820、1822和1824。例如,計算設(shè)備(例如,1820、1822和1824)可以是計算機(jī)(例如,桌面型或膝上型計算機(jī))、移動設(shè)備(例如,平板計算機(jī)或智能電話)或者其他類型的計算設(shè)備。例如,計算設(shè)備(例如,1820、1822和1824)可利用云計算服務(wù)1810來執(zhí)行計算操作(例如,數(shù)據(jù)處理、數(shù)據(jù)存儲等等)。示例12—實(shí)現(xiàn)雖然公開的一些方法的操作為了方便演示是按特定先后順序描述的,但應(yīng)當(dāng)理解這種描述方式涵蓋了重排列,除非由下文記載的具體語言要求特定的排序。例如,順序描述的操作在一些情況中可被重排列或者被同時執(zhí)行。另外,為了簡單起見,附圖可能沒有示出公開的方法可結(jié)合其他方法使用的各種方式、公開的任何方法可實(shí)現(xiàn)為存儲在一個或多個計算機(jī)可讀存儲介質(zhì)上并在計算設(shè)備(例如,任何可用的計算設(shè)備,包括智能電話或者其他包括計算硬件的移動設(shè)備)上執(zhí)行的計算機(jī)可執(zhí)行指令或者計算機(jī)程序產(chǎn)品。有形計算機(jī)可讀存儲介質(zhì)是可在計算環(huán)境內(nèi)訪問的任何可用的有形介質(zhì)(例如,一個或多個光介質(zhì)盤,比如dvd或cd,易失性存儲器組件(比如dram或sram),或者非易失性存儲器組件(比如閃存或硬盤驅(qū)動器))。作為示例,參考圖18,計算機(jī)可讀存儲介質(zhì)包括存儲器1720和1725,以及存儲裝置1740。術(shù)語計算機(jī)可讀存儲介質(zhì)不包括信號和載波。此外,術(shù)語計算機(jī)可讀存儲介質(zhì)不包括通信連接(例如,1770)。用于實(shí)現(xiàn)公開的技術(shù)的任何計算機(jī)可執(zhí)行指令以及在公開的實(shí)施例的實(shí)現(xiàn)期間創(chuàng)建和使用的任何數(shù)據(jù)可被存儲在一個或多個計算機(jī)可讀存儲介質(zhì)上。計算機(jī)可執(zhí)行指令可以是例如專用軟件應(yīng)用或者經(jīng)由基于web瀏覽器或其他軟件應(yīng)用(例如遠(yuǎn)程計算應(yīng)用)訪問或下載的軟件應(yīng)用的一部分。這種軟件可例如在單個本地計算機(jī)(例如,任何適當(dāng)?shù)氖惺塾嬎銠C(jī))上執(zhí)行或者利用一個或多個網(wǎng)絡(luò)計算機(jī)在網(wǎng)絡(luò)環(huán)境中(例如,經(jīng)由互聯(lián)網(wǎng)、廣域網(wǎng)、局域網(wǎng)、客戶端-服務(wù)器網(wǎng)絡(luò)(比如云計算網(wǎng)絡(luò))或其他這種網(wǎng)絡(luò))執(zhí)行。為了清晰,只描述了基于軟件的實(shí)現(xiàn)方式的某些選擇的方面。省略了本領(lǐng)域公知的其他細(xì)節(jié)。例如,應(yīng)當(dāng)理解,公開的技術(shù)不限于任何具體的計算機(jī)語言或程序。例如,公開的技術(shù)可由以c++、java、perl、javascript、adobeflash或任何其他適當(dāng)?shù)木幊陶Z言編寫的軟件來實(shí)現(xiàn)。類似地,公開的技術(shù)不限于任何特定的計算機(jī)或者任何特定類型的硬件。適當(dāng)?shù)挠嬎銠C(jī)和硬件的某些細(xì)節(jié)是公知的并且不需要在本公開中詳細(xì)記載。此外,任何基于軟件的實(shí)施例(包括例如用于使得計算機(jī)執(zhí)行任何公開的方法的計算機(jī)可執(zhí)行指令)可通過適當(dāng)?shù)耐ㄐ攀侄蝸砩蟼?、下載或遠(yuǎn)程訪問。這種適當(dāng)?shù)耐ㄐ攀侄伟ɡ缁ヂ?lián)網(wǎng)、萬維網(wǎng)、內(nèi)聯(lián)網(wǎng)、軟件應(yīng)用、線纜(包括光纜)、磁通信、電磁通信(包括rf、微波和紅外通信)、電子通信或者其他這種通信手段。公開的方法、裝置和系統(tǒng)不應(yīng)當(dāng)被解釋為以任何方式作出限制。反而,本公開針對各種公開的實(shí)施例的所有新穎且非顯而易見的特征和方面,無論是單獨(dú)的還是與彼此發(fā)生各種組合和子組合。公開的方法、裝置和系統(tǒng)不限于任何特定方面或特征或者其組合,并且公開的實(shí)施例也不要求任何一個或多個特定優(yōu)點(diǎn)存在或者問題被解決。來自任何示例的技術(shù)可與在任何一個或多個其他示例中描述的技術(shù)相結(jié)合。鑒于公開的技術(shù)的原理可應(yīng)用到的許多可能實(shí)施例,應(yīng)當(dāng)認(rèn)識到例示的實(shí)施例是公開的技術(shù)的示例并且不應(yīng)當(dāng)被理解為對公開的技術(shù)的范圍的限制。更確切地說,公開的技術(shù)的范圍包括由所附權(quán)利要求的范圍和精神所覆蓋的范圍。當(dāng)前第1頁12當(dāng)前第1頁12