16.6.1 立即更新訂購者
所謂立即更新訂購者是指在復(fù)制時(shí)使用了立即更新選項(xiàng)。通常而言,快照復(fù)制和事務(wù) 復(fù)制都是單向數(shù)據(jù)復(fù)制即數(shù)據(jù)從出版者的源數(shù)據(jù)庫復(fù)制到訂購者的目標(biāo)數(shù)據(jù)庫。但是SQL Server 通過允許訂購者來修改復(fù)制數(shù)據(jù)而增強(qiáng)了這種模式的功能。立即更新訂購者選項(xiàng)允 許既可以在出版者也可以在訂購者處對復(fù)制數(shù)據(jù)進(jìn)行修改。立即更新是指對復(fù)制數(shù)據(jù)進(jìn)行 修改的訂購者與出版者之間保持?jǐn)?shù)據(jù)的立即更新,即立即將訂購者的修改反映到出版者那 里。并且提供了對其它訂購者而言的潛在事務(wù)一致性,即訂購者的修改在立即反映到出版 者那里之后,允許這一修改不必馬上同步到其它訂購者那里。在創(chuàng)建出版物時(shí)對該選項(xiàng)進(jìn) 行設(shè)置。
應(yīng)該強(qiáng)調(diào)的是,在對數(shù)據(jù)進(jìn)行修改的訂購者與出版者之間使用了兩階段提交協(xié)議,從 而要求當(dāng)訂購者對數(shù)據(jù)的修改在出版者那里被成功提交之后,這一修改才會在該訂購者處 被提交。如果提交成功,然后出版者才會在分發(fā)代理執(zhí)行時(shí)(如果是快照復(fù)制,則也可以 是在快照被刷新時(shí)),把這種修改分發(fā)到其它的訂購者那里。
與完全的兩階段提交協(xié)議相比,立即更新訂購者選項(xiàng)降低了復(fù)制的復(fù)雜性以及事務(wù)提 交失敗的可能性。因?yàn)橥耆膬呻A段協(xié)議要求所有參與事務(wù)的服務(wù)器之間必須有可靠的網(wǎng) 絡(luò)連接,并且對數(shù)據(jù)的修改只有在所有的參與者中都被成功提交才會生效但當(dāng)設(shè)置立即 更新訂購者選項(xiàng)時(shí),由于僅在對復(fù)制數(shù)據(jù)進(jìn)行修改的訂購者與出版者之間使用了二階段提 交協(xié)議,所以事務(wù)的完整性仍得到很好的維護(hù),而在出版者和其它訂購者之間并不使用二 階段提交協(xié)議,這樣便取消了所有參與者必須保持?jǐn)?shù)據(jù)同步的復(fù)雜性。
注意:合并復(fù)制不允許使用立即更新訂購者選項(xiàng)。
在SQL Server 2000 中,若設(shè)置了立即更新訂購者選項(xiàng)則,需要以下組件的支持;
觸發(fā)器
存儲過程
Microsoft 的分布式事務(wù)協(xié)調(diào)器MS DTC
沖突檢測
環(huán)路檢測
1 觸發(fā)器
觸發(fā)器位于訂購者,被用來捕捉在訂購者上發(fā)生的事務(wù)并利用遠(yuǎn)程過程調(diào)用將事務(wù)提 交給出版者。由于使用二階段提交協(xié)議,從而保證事務(wù)在出版者被成功提交后才會在訂購 者那里提交,如果提交失敗,則訂購者事務(wù)將回滾,從而使訂購者數(shù)據(jù)庫與出版者數(shù)據(jù)庫 仍能保持同步。
2 存儲過程
存儲過程位于出版者上,如果自訂購者上次接收復(fù)制數(shù)據(jù)以來,出版者數(shù)據(jù)庫發(fā)生的 變化與訂購者提交的事務(wù)不發(fā)生沖突,才允許在出版者提交這些來自訂購者的事務(wù)。若有 沖突發(fā)生,則拒絕事務(wù)提交,兩處的事務(wù)都將回滾。每篇論文都有為INSERT、 DELETE、 UPDATE 事務(wù)創(chuàng)建的存儲過程。
3 Microsoft 的分布式事務(wù)協(xié)調(diào)器(MS DTC)
在觸發(fā)器使用存儲過程將訂購者事務(wù)提交給出版者時(shí),需要Microsoft 的分布式事務(wù) 協(xié)調(diào)器(MS DTC) 來管理出版者與訂購者之間的兩階段提交。遠(yuǎn)程存儲過程使用BEGIN DISTRIBUTED TRANSACTION 來對MS DTC 進(jìn)行初始化操作。
4 沖突檢測
出版數(shù)據(jù)庫中的存儲過程使用時(shí)間戳來進(jìn)行檢測,以確定某列被復(fù)制到訂購者之后是 否又被修改。當(dāng)訂購者提交立即更新事務(wù)時(shí),它會把某行的所有列(包括時(shí)間戳列)送回 到出版者,出版者利用存儲過程將該行當(dāng)前(屬于出版者數(shù)據(jù)庫)的時(shí)間戳值與從訂購者 送回的時(shí)間戳值進(jìn)行比較,如果相同,表明在復(fù)制給訂購者之后沒有發(fā)生修改,則接收事 務(wù)(用從訂購者送回的行值來修改該行的當(dāng)前值)。
5 環(huán)路檢測
環(huán)路檢測主要是基于以下考慮而被提出的,即如果訂購者的立即更新事務(wù)在出版者和 訂購者都被成功提交后,出版者要在以后的某一時(shí)刻將該事務(wù)復(fù)制到其它訂購者,但是由 于提交立即更新事務(wù)的訂購者已成功提交了該事務(wù),因此也就沒有必要再將此事務(wù)從出版 者那里復(fù)制給該訂購者。如何解決該問題呢?環(huán)路檢測就是用來確定一事務(wù)是否已在某訂購者服務(wù)器處被成功提交,從而避免該事務(wù)又一次應(yīng)用于訂購者服務(wù)器,最終因破壞了完 整性約束(如向同一表中插入同一行)導(dǎo)致復(fù)制中止。
16.6.2 排隊(duì)更新訂購者
排隊(duì)更新選項(xiàng)是SQL Server 2000 的新增功能。與立即更新訂購者一樣,排隊(duì)更新允 許快照復(fù)制或事務(wù)復(fù)制的訂購者對復(fù)制數(shù)據(jù)的修改,然后將修改反映到出版者那里。但不 同的是,排隊(duì)更新并不要求訂購者與出版者之間的網(wǎng)絡(luò)連接一直處于激活狀態(tài)。
通常在創(chuàng)建出版物時(shí)對該復(fù)制選項(xiàng)進(jìn)行設(shè)置,如果使用了排隊(duì)更新選項(xiàng),那么訂購者 對復(fù)制數(shù)據(jù)的修改是保存在一個(gè)隊(duì)列中。當(dāng)訂購者與出版者之間的網(wǎng)絡(luò)連接恢復(fù)時(shí),這些 隊(duì)列中的事務(wù)將按先后順序被應(yīng)用到出版者。
由于訂購者對復(fù)制數(shù)據(jù)的修改是以異步的方式反映到出版者那里的,所以,一旦同一 數(shù)據(jù)被出版者或其它的訂購者修改,則容易出現(xiàn)復(fù)制數(shù)據(jù)的修改沖突。在創(chuàng)建出版物時(shí), 我們通常也要決定沖突的解決策略,從而對可以出現(xiàn)的沖突提供解決方案,保證復(fù)制數(shù)據(jù) 的一致性。
如果用戶經(jīng)常讀到數(shù)據(jù),并且偶爾修改數(shù)據(jù),則在該情況下推薦使用排隊(duì)修改,這樣 訂購者即使在離線的情況下仍可以對復(fù)制數(shù)據(jù)進(jìn)行修改。
在SQL Server 2000 中,若設(shè)置了立即更新訂購者選項(xiàng),則需要以下組件的支持:
觸發(fā)器
隊(duì)列
存儲過程
隊(duì)列閱讀代理
1 觸發(fā)
觸發(fā)器依附在訂購者的出版表上,當(dāng)進(jìn)行排隊(duì)更新時(shí),觸發(fā)器用來捕捉訂購者上執(zhí)行 的事務(wù),然后將這些事務(wù)包在消息中并傳送到隊(duì)列中。
2 存儲過程
在創(chuàng)建出版物時(shí),若指定了排隊(duì)更新選項(xiàng),則在出版數(shù)據(jù)庫中對出版表執(zhí)行插入、刪 除、更新的存儲過程將自動(dòng)生成。隊(duì)列閱讀代理將調(diào)用存儲過程在出版者上執(zhí)行隊(duì)列中的 事務(wù),并進(jìn)行沖突檢,測如有必要?jiǎng)t產(chǎn)生一些補(bǔ)充命令,這些命令首先傳給分發(fā)數(shù)據(jù)庫, 然后傳送給訂購者。除此之外,在出版者上仍要?jiǎng)?chuàng)建記錄沖突信息,并將沖突信息傳遞給 相關(guān)訂購者的存儲過程,如果檢測到?jīng)_突,這些存儲過程將由隊(duì)列閱讀代理調(diào)用。
3 隊(duì)列
隊(duì)列主要用來存儲包含訂購者事務(wù)的消息,訂購者與分發(fā)者都有一個(gè)消息隊(duì)列。在網(wǎng) 絡(luò)斷開的情況下,包含訂購者事務(wù)的消息首先存儲在訂購者消息隊(duì)列,然后在網(wǎng)絡(luò)接通時(shí) 被傳送到分發(fā)者消息隊(duì)列。隊(duì)列閱讀代理讀到這些消息并將消息中的事務(wù)應(yīng)用到出版者。
4 隊(duì)列閱讀代理
隊(duì)列閱讀代理運(yùn)行在分發(fā)者上多線程代理,其主要任務(wù)就是從消息隊(duì)列中讀取信息并 將事務(wù)應(yīng)用到出版者。
16.6.3 轉(zhuǎn)換復(fù)制數(shù)據(jù)
轉(zhuǎn)換復(fù)制數(shù)據(jù)是SQL Server 2000 新增的功能。用可轉(zhuǎn)換訂購(Transformable subscriptions) 來實(shí)現(xiàn)復(fù)制數(shù)據(jù)的轉(zhuǎn)換。可轉(zhuǎn)換訂購主要是利用數(shù)據(jù)轉(zhuǎn)換服務(wù)(DTS)所提供的 功能,如數(shù)據(jù)移動(dòng)、傳遞映射、過濾等,從而可以根據(jù)每個(gè)訂購者的具體要求來定制、發(fā) 送復(fù)制數(shù)據(jù)。它可以在快照復(fù)制和事務(wù)復(fù)制中使用。比如,在以下情況下我們應(yīng)該使用轉(zhuǎn) 換復(fù)制數(shù)據(jù)選項(xiàng):
根據(jù)每一訂購者對出版數(shù)據(jù)進(jìn)行列或水平分割
在SQL Server 2000 以前的版本中,由于不同的訂購者需要不同的數(shù)據(jù)(這里訂購者 所需要的數(shù)據(jù)是指表在垂直或水平分割后的某一部分),所以必須把數(shù)據(jù)分割成不同的數(shù) 據(jù)塊,從而在創(chuàng)建快照復(fù)制或事務(wù)復(fù)制時(shí),也要分別為每一個(gè)訂購者創(chuàng)建不同的出版物。 這給復(fù)制的管理和配置帶來極大的不便,由此可增加系統(tǒng)的負(fù)擔(dān)。但是在SQL Server 2000 中,可轉(zhuǎn)換訂購允許為同一出版物創(chuàng)建定制的數(shù)據(jù)分割(列或行分割),即同一出版物支 持多個(gè)訂購,從而滿足不同訂購者對出版數(shù)據(jù)的不同需求。
創(chuàng)建數(shù)據(jù)轉(zhuǎn)換,如數(shù)據(jù)類型匹配、列操作(如兩列合成一列)、字符串操作、用 戶自定義函數(shù)等。
使用可轉(zhuǎn)換訂購在出版者與訂購者之間進(jìn)行基本的、簡單的數(shù)據(jù)轉(zhuǎn)換和列操作主要包括以下幾個(gè)方面:
改變數(shù)據(jù)類型(除主鍵列外)
重新命名某列
從某列提取子字符串或向某列添加額外的字符
對某列使用函數(shù)
在創(chuàng)建出版物時(shí)設(shè)置該選項(xiàng)。完成該選項(xiàng)設(shè)置后,將創(chuàng)建一個(gè)復(fù)制DTS 包,訂購者將把該DTS 包作為出版物的一部分。
下面我們將介紹在Enterprise Manager 中如何創(chuàng)建可轉(zhuǎn)換訂購。
首先,在創(chuàng)建出版物時(shí)要設(shè)置Transform Published Data 選項(xiàng),在創(chuàng)建出版物的step6
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com