共用方式為


點對點複寫中的衝突偵測

點對點事務複製可讓您在拓撲中的任何節點上插入、更新或刪除數據,並將數據變更傳播至其他節點。 因為您可以在任何節點上變更數據,所以不同節點的數據變更可能會彼此衝突。 如果數據列在多個節點上修改,當數據列傳播至其他節點時,可能會導致衝突,甚至是遺失的更新。

SQL Server 2008 和更新版本中的點對點複寫提供在點對點拓撲之間啟用衝突偵測的選項。 此選項有助於防止未偵測到衝突所造成的問題,包括不一致的應用程式行為和遺失的更新。 啟用此選項時,預設會將衝突的變更視為導致散發代理程式失敗的嚴重錯誤。 發生衝突時,拓撲會維持不一致的狀態,直到衝突解決,且數據在拓撲之間保持一致。

備註

若要避免潛在的數據不一致,請確保在點對點拓撲中避免衝突,即使啟用了衝突偵測,也要注意避免發生衝突。 為了確保特定數據列的寫入作業只會在一個節點上執行,存取和變更數據的應用程式必須分割插入、更新和刪除作業。 分區可確保針對某一節點來源的指定行進行的修改,會在這行被不同節點修改之前,先與拓撲中的所有其他節點同步。 如果應用程式需要複雜的衝突偵測和解決功能,請使用合併式複寫。 如需詳細資訊,請參閱合併式複寫和偵測和解決合併式複寫衝突

了解衝突和衝突偵測

在單一資料庫中,由不同應用程式對相同數據列所做的變更不會造成衝突。 這是因為交易已串行化,而且會使用鎖定來處理並行變更。 在異步分散式系統中,例如點對點複寫,交易會在每個節點上獨立運作;而且沒有可跨多個節點串行化交易的機制。 可以使用兩階段提交協議之類的協議,但這會顯著影響效能。

在點對點複製等系統中,當個別對等端提交變更時,不會偵測到衝突。 相反地,當這些變更複寫並套用至其他對等時,就會偵測到這些變更。 在點對點複寫中,儲存過程會根據每個已發布資料表中的隱藏欄位,偵測並套用變更至每個節點,以檢測衝突。 這個隱藏的數據行會儲存標識碼,這個標識符會結合您為每個節點和數據列版本指定的 建立器標識符 。 在同步處理期間,散發代理程式會針對每個數據表執行程式。 這些程式會套用來自其他對等的插入、更新和刪除作業。 如果其中一個程式讀取隱藏的數據行值時偵測到衝突,則會引發錯誤 22815,其嚴重性層級為 16:

A conflict of type '%s' was detected at peer %d between peer %d (incoming), transaction id %s and peer %d (on disk), transaction id %s

根據預設,此錯誤會導致散發代理程式停止將變更套用至該節點。 如需如何處理偵測到之衝突的資訊,請參閱本主題稍後的。

備註

隱藏的數據行只能由透過專用系統管理員連接登入的使用者存取。 如需 DAC 的相關信息,請參閱 資料庫管理員的診斷連線

點對點複寫會偵測下列類型的衝突:

  • Insert-insert

    參與點對點複寫的每個數據表中的所有數據列都會使用主鍵值來唯一識別。 在多個節點上插入具有相同索引鍵值的數據列時,就會發生插入插入衝突。

  • 更新-更新

    當相同行在多個節點上被更新時會發生。

  • 插入或更新

    如果某個數據列在一個節點上更新,但相同的數據列已刪除,然後在另一個節點上重新插入,就會發生。

  • Insert-delete

    如果在某個節點上刪除數據列,但相同的數據列已刪除,然後在另一個節點上重新插入,就會發生。

  • 更新-刪除

    如果在某個節點上更新數據列,但在另一個節點上刪除了相同的數據列,就會發生。

  • 刪除-刪除

    在多個節點上刪除數據列時發生。

啟用衝突偵測

若要使用衝突偵測,所有節點都必須執行 SQL Server 2008 或更新版本;和偵測必須針對所有節點啟用。 根據預設,在 SQL Server 2008 和更新版本中,SQL Server Management Studio 中會啟用衝突偵測。 建議您啟用偵測,即使在您未預期任何衝突的情況下也一樣。 您可以使用 Management Studio 或 Transact-SQL 預存程式來啟用和停用衝突偵測:

  • 您可以使用 [發行集屬性] 對話框的 [訂閱選項] 頁面或 [設定對等拓撲精靈] 的 [設定拓撲] 頁面,在 Management Studio 中啟用和停用偵測功能。

    如果您使用Management Studio 設定衝突偵測,則散發代理程式會設定為在偵測到衝突時停止套用變更。

  • 您也可以使用下列預存程式來啟用和停用偵測: sp_addpublicationsp_configure_peerconflictdetection

    如果您使用預存程式設定衝突偵測,您可以指定偵測到衝突時,散發代理程式是否應該停止套用變更。 預設為代理程式停止。 建議您使用預設設定。

處理衝突

在點對點復寫中發生衝突時,就會引發點對點衝突偵測警示。 建議您設定此警示,以便在發生衝突時收到通知。 如需警示的詳細資訊,請參閱 使用複寫代理程式事件的警示

在散發代理程式停止並引發警示之後,請使用下列其中一種方法來處理發生的衝突:

  • 從包含所需資料的節點備份中,重新初始化檢測到衝突的節點(推薦的方法)。 此方法可確保數據處於一致狀態。

  • 嘗試再次同步節點,方法是啟用散發代理程式以繼續套用變更:

    1. 執行 sp_changepublication:為 @property 參數指定『p2p_continue_onconflict』,為 @value 參數指定 true

    2. 重新啟動散發代理程式。

    3. 使用衝突查看器來確認偵測到的衝突,並判斷所涉及的數據列、衝突類型和獲勝者。 衝突會根據您在組態期間指定的建立器標識碼值來解決:源自節點且標識元最高的數據列會贏得衝突。 如需詳細資訊,請參閱檢視交易式發行集的數據衝突(SQL Server Management Studio)。

    4. 執行驗證,以確保衝突的資料列能夠正確匯聚。 如需詳細資訊,請參閱驗證複製的資料

      備註

      如果此步驟之後的數據不一致,您必須手動更新具有最高優先順序之節點上的數據列,然後讓變更從這個節點傳播。 如果拓撲中沒有任何進一步衝突的變更,所有節點都會處於一致狀態。

    5. 執行 sp_changepublication:為 @property 參數和 false@value 參數指定 『p2p_continue_onconflict』。

另請參閱

點對點事務複製