可更新訂閱的工作方式
交易式複寫的可更新訂閱允許訂閱者複寫對發行者的變更。觸發程序會被加入訂閱資料庫之已發行資料表中,並在訂閱者端進行變更時啟動:
- 對於立即更新訂閱,變更會直接傳播至發行者,並使用 Microsoft Distributed Transaction Coordinator (MSDTC) 來套用。
- 對於佇列更新訂閱,變更會先傳播至佇列,然後由「佇列讀取器代理程式」套用至發行者。
在發行者端所作的變更會複寫至訂閱者,方式與訂閱者為唯讀之交易式發行集的方式相同。如需詳細資訊,請參閱<交易式複寫的運作方式>。
立即更新
立即更新訂閱使用下列元件:
- 追蹤每個已發行資料表的資料行
在允許可更新訂閱的發行集內發行資料表時,資料行 msrepl_tran_version 會加入資料表。此資料行用來變更追蹤和衝突偵測。如果訂閱者更新資料的過期副本,則會發生立即更新衝突。 - MSDTC
對於訂閱者端所作的每項變更,MSDTC 都會管理認可變更之發行者與訂閱者間的兩階段認可作業。此方法對於所有參與站台上兩階段認可的使用沒有可用性限制,因為只需要使用「發行者」。使用兩階段認可在發行者端進行變更後,變更會由「散發代理程式」複寫至其他訂閱者。 - 訂閱資料庫中資料表的觸發程序
插入、更新和刪除觸發程序已加入訂閱資料庫中各個已發行資料表中。使用 CREATE TRIGGER 陳述式的 NOT FOR REPLICATION 修飾詞建立觸發程序,這樣散發代理程式套用的變更就不會導致引發觸發程序。如需詳細資訊,請參閱<使用 NOT FOR REPLICATION 控制條件約束、識別和觸發程序>。
對於立即更新訂閱,觸發程序還會管理訂閱者端從 identity 和 timestamp 資料行的值。這些資料行類型的值會在發行者端產生,並作為兩階段認可作業的一部份傳播到訂閱者。 - 預存程序
當您建立發行集並使其可用於立即更新訂閱時,便會為發行集資料庫中每個已發行的資料表建立插入、更新及刪除程序。當訂閱者端發生變更時,複寫觸發程序會透過 MSDTC 向發行者端上適當的預存程序發出遠端程序呼叫,隨後該預存程序便會套用該變更。
發行者端的預存程序只有在與發行者端所作的變更 (訂閱者上次接收其已變更資料行的副本之後) 不發生衝突時才會套用變更。如果偵測到衝突,交易就會被拒絕並在發行者端和訂閱者端回復。
下圖顯示包含立即更新訂閱的拓樸中所使用的主要元件。
- 在訂閱者端所作的變更由訂閱資料表上的觸發程序擷取。
- 觸發程序透過 MSDTC 對發行者端的適當預存程序進行呼叫。
- 如果沒有衝突,預存程序便會執行插入、更新或刪除作業。如果有衝突,變更則會在發行者端和訂閱者端回復。
- 發行者根據訂閱者複寫變更結果所做的變更,依散發代理程式排程傳播至所有其他訂閱者
佇列更新
佇列更新訂閱使用下列元件:
- 追蹤每個已發行資料表的資料行
在允許可更新訂閱的發行集內發行資料表時,資料行 msrepl_tran_version 會加入資料表。此資料行用來變更追蹤和衝突偵測。 - 訂閱資料庫中資料表的觸發程序
插入、更新和刪除觸發程序已加入訂閱資料庫中各個已發行資料表中。使用 CREATE TRIGGER 陳述式的 NOT FOR REPLICATION 修飾詞建立觸發程序,這樣散發代理程式套用的變更就不會導致引發觸發程序。如需詳細資訊,請參閱<使用 NOT FOR REPLICATION 控制條件約束、識別和觸發程序>。 - 預存程序
當您建立發行集並使其可用於佇列更新訂閱時,便會為發行集資料庫中每個已發行的資料表建立插入、更新及刪除程序。
預存程序由「佇列讀取器代理程式」呼叫,以在發行者端套用交易、偵測衝突,並在需要時產生補償命令 (該命令會公佈到散發資料庫,然後傳遞至「訂閱者」)。
在發行者端記錄衝突資訊,並選擇性地將衝突資訊發送至相關訂閱者的預存程序也會在發行者端建立。如果偵測到衝突,便會由「佇列讀取器代理程式」叫用。 - Microsoft SQL Server 佇列
每個訂閱資料庫都包含系統資料表 MSreplication_queue,該資料表會儲存來自「訂閱者」的變更。 - SQL Server 佇列讀取器代理程式
「佇列讀取器代理程式」會讀取來自 MSreplication_queue 的變更,並將其套用至「發行者」。如需詳細資訊,請參閱<Replication Queue Reader Agent>。
下圖顯示包含佇列更新訂閱的拓樸中所使用的主要元件。
- 在訂閱者端所作的更新由訂閱資料表上的觸發程序擷取。觸發程序會將這些更新儲存在 MSreplication_queue 中。
- 「佇列讀取器代理程式」從 MSreplication_queue 進行讀取,然後使用複寫預存程序將佇列交易套用至適當的發行集。
- 套用佇列交易時,會偵測衝突 (如果有的話) 並根據建立發行集時設定的衝突解決原則加以解決。因此,可能會產生補償命令,使用標準交易式複寫散發處理 (它們只傳送至產生衝突的訂閱者) 將交易回復至訂閱者。如需詳細資訊,請參閱<佇列更新衝突偵測和解決>。
- 發行者根據訂閱者複寫變更結果所做的變更,依散發代理程式排程傳播至所有其他訂閱者