對等複製中的衝突檢測

iSQlServer發表於2008-12-18

通過對等事務複製可以在拓撲中的任何節點插入、更新或刪除資料並將資料更改傳播到其他節點。由於可在任何節點上更改資料,因此在不同節點上進行的資料更改可能會相互衝突。如果在多個節點上修改了某一行,則將該行傳播給其他節點時可能會導致衝突甚至會丟失更新。

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章