對等複製中的衝突檢測
通過對等事務複製可以在拓撲中的任何節點插入、更新或刪除資料並將資料更改傳播到其他節點。由於可在任何節點上更改資料,因此在不同節點上進行的資料更改可能會相互衝突。如果在多個節點上修改了某一行,則將該行傳播給其他節點時可能會導致衝突甚至會丟失更新。
SQL Server 2008 中的對等複製引入了在對等拓撲中啟用衝突檢測的選項。此選項將有助於防止出現因未檢測到的衝突而引發的各種問題,包括不一致的應用程式行為和丟失的更新。啟用該選項後,預設情況下,發生衝突的更改將被視為導致分發代理失敗的關鍵錯誤。發生衝突時,拓撲將始終處於不一致的狀態,直至衝突得以解決而且拓撲中的資料保持一致。
注意:
為了避免潛在的資料不一致性,即便已經啟用了衝突檢測功能,也應盡力避免對等拓撲中發生衝突。為了確保僅在某一個節點上執行特定行的寫入操作,訪問並更改資料的應用程式必須對其插入、更新和刪除操作進行分割槽。分割槽可確保在一個節點上對給定行進行的修改可以在其他節點修改該行之前,與拓撲中的所有其他節點同步。如果應用程式需要完善的衝突檢測與解決功能,請使用合併複製。有關詳細資訊,請參閱合併複製概述和檢測並解決合併複製衝突。
瞭解衝突和衝突檢測
在單個資料庫中,不同應用程式對同一行進行的更改不會導致衝突。原因在於,事務已經過序列化,並使用鎖定來處理併發更改。在非同步分散式系統(如對等複製)中,事務獨立作用於每個節點,而且沒有用來跨多個節點對事務進行序列化的機制。可以使用兩階段提交之類的協議,但是這會顯著影響效能。
在對等複製之類的系統中,在單個對等節點上提交更改之後將檢測不到衝突。相反,在複製這些更改並將其應用於其他對等節點之後,才能夠檢測到這些更改。在對等複製中,用來將更改應用於每個節點的儲存過程會基於每個已釋出表中的某個隱藏列來檢測衝突。該隱藏列所儲存的 ID 將您為每個節點指定的“發起方 ID”與行版本結合起來。在同步期間,分發代理會針對每個表執行同步過程。這些過程會應用來自其他對等節點的插入、更新和刪除操作。如果某個過程在讀取該隱藏列的值時檢測到衝突,將會引發嚴重級別為 16 的錯誤 22815:
在事務 ID 為 %s 的對等方 %d (傳入)和事務 ID 為 %s 的對等方 %d (在磁碟上)之間的對等方 %d 處檢測到型別為 '%s' 的衝突
預設情況下,此錯誤會導致分發代理停止向該節點應用所做的更改。有關如何處理所檢測到衝突的資訊,請參閱本主題稍後部分中的“處理衝突”。
注意:
隱藏列只能由通過專用管理員連線 (DAC) 登入的使用者來訪問。有關 DAC 的資訊,請參閱使用專用管理員連線。
對等複製檢測到下列型別的衝突:
插入-插入
每個表中所有參與對等複製的行都使用主鍵值進行唯一標識。在將具有相同鍵值的行插入到多個節點時,會發生插入-插入衝突。
更新-更新
在多個節點上更新了同一行時發生。
插入-更新
在以下情況下發生:在一個節點上更新了某行,但是在另一個節點上刪除了該行,然後又重新插入該行。
插入-刪除
在以下情況下發生:在一個節點上刪除了某行,但是在另一個節點上刪除了該行,然後又重新插入該行。
更新-刪除
在以下情況下發生:在一個節點上更新了某行,但是在另一個節點上刪除了該行。
刪除-刪除
在多個節點上刪除了同一行時發生。
啟用衝突檢測
若要使用衝突檢測,所有節點都必須執行 SQL Server 2008 或更高版本,並且必須為所有節點啟用檢測。在 SQL Server 2008 和更高版本中,預設情況下,衝突檢測在 SQL Server Management Studio 中處於啟用狀態。我們建議您啟用衝突檢測,即使在應當不會有任何衝突時也是如此。可以使用 Management Studio 或 Transact-SQL 儲存過程來啟用和禁用衝突檢測:
在 Management Studio 中,可以使用“釋出屬性”對話方塊的“訂閱選項”頁或配置對等拓撲向導的“配置拓撲”頁來啟用和禁用衝突檢測。有關詳細資訊,請參閱如何為對等事務複製配置衝突檢測(SQL Server Management Studio)。
如果您使用 Management Studio 來配置衝突檢測,則分發代理將配置為在檢測到衝突時停止應用所做的更改。
還可以使用 sp_addpublication 或 sp_configure_peerconflictdetection 儲存過程來啟用和禁用衝突檢測。有關詳細資訊,請參閱如何為對等事務複製配置衝突檢測(複製 Transact-SQL 程式設計)。
如果您使用儲存過程來配置衝突檢測,則可以指定在檢測到衝突時分發代理是否應當停止應用所做的更改。預設值是讓分發代理停止。我們建議您使用預設設定。
處理衝突
對等複製中發生衝突時,會引發對等衝突檢測警報。我們建議您配置該警報,以便在發生衝突時獲得通知。有關警報的更多資訊,請參閱為複製代理事件使用警報。
在分發代理停止並且引發警報之後,請使用下列方法之一來處理所發生的衝突:
從包含必需資料的節點的備份中重新初始化檢測到衝突的節點(建議的方法)。此方法可確保資料保持一致狀態。有關詳細資訊,請參閱如何配置對等事務複製(複製 Transact-SQL 程式設計)中用來向拓撲新增節點的過程。
嘗試通過允許分發代理繼續應用所做的更改來再次同步節點:
執行 sp_changepublication:為 @property 引數指定“p2p_continue_onconflict”,為 @value 引數指定 true。
重新啟動分發代理。
使用衝突檢視器來驗證所檢測到的衝突,並確定所涉及的行、衝突型別以及入選方。衝突可基於您在配置過程中指定的發起方 ID 值來解決:源自具有最高 ID 的節點的行將在衝突中入選。有關詳細資訊,請參閱如何檢視事務釋出的資料衝突 (SQL Server Management Studio)。
執行驗證步驟以確保發生衝突的行能夠正確收斂。有關詳細資訊,請參閱驗證已複製的資料。
注意:
如果在執行該步驟之後資料不一致,則必須在具有最高優先順序的節點上手動更新行,然後允許從該節點傳播所做的更改。如果拓撲中不再有發生衝突的更改,則所有的節點都將置於一致狀態。
執行 sp_changepublication:為 @property 引數指定“p2p_continue_onconflict”,為 @value 引數指定 false。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-515911/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- shell檢測ip衝突
- OGG複製與加密欄位的衝突加密
- 基於C#的多邊形衝突檢測C#
- 如何在VS Code中啟用實時合併衝突檢測?
- MySQL中的冪等複製分析MySql
- 衝突解決方案概念和體系結構——高階複製
- 如何避免javascript中的衝突JavaScript
- Linux下檢測IP地址衝突及解決方法Linux
- 如何看待遊戲創作中,製作者與玩家的理念衝突?遊戲
- Linux中的衝突問題及其應對策略(轉)Linux
- 自動檢測ARouter路由地址分組使用衝突問題路由
- PHP中的trait方法衝突PHPAI
- scrollview 的滑動衝突 viewpager等都適用Viewpager
- 關於測試環境版本管理(對於衝突檔案)
- Linux系統中的衝突問題及其應對策略(轉)Linux
- 程式碼審查中的暴力衝突
- SQL Server 2008實現對等複製的方法SQLServer
- svn檔案衝突,樹衝突詳解
- jQuery的$命名衝突jQuery
- iOS 開發中遇到的手勢衝突iOS
- 專案管理中的衝突是什麼?專案管理
- PPT中聲音“衝突”的解決方法
- 解決Oracle XDB與Tomcat等的8080埠的衝突OracleTomcat
- Eclipse中Egit衝突解決EclipseGit
- Maven Idea檢視解決jar包衝突MavenIdeaJAR
- mysql忽略主鍵衝突、避免重複插入的幾種方式MySql
- mysql 忽略主鍵衝突、避免重複插入的幾種方式MySql
- SQL Server 2008配置拓撲(對等複製)SQLServer
- SQL Server 2008配置對等事務複製SQLServer
- 腦脊液中腦部腫瘤相關突變的檢測
- iceberg合併小檔案衝突測試
- Maven中解決依賴衝突的問題Maven
- JavaScript中的淺複製與深複製JavaScript
- 解衝突用到的命令
- 聊天室原始碼開發中應對雜湊衝突的解決方案原始碼
- commit 衝突MIT
- 雜湊衝突
- MySQL中的複製MySql