在幾篇文章當中,我介紹了 SnapShot(快照方式)和“只同步新更改和增量更改”這兩種同步方式並對相應的生成文件進行了粗略的分析。今天開始把話題深入一下,聊一聊MSF的沖突檢測和處理。
這裡所說的沖突(Conflict) 主要是指當客戶端與服務端數據在進行CUD時,所操作的數據同步期間發生了錯誤,如通常所說的約束沖突(主鍵重復),以及在同步時多個節點(客戶端)上更改了同一行,或服務端刪除該行而其它節點卻更新了該行便存在沖突等。當然在設計應用程序時應避免產生沖突(比如可通過篩選行和列等方式做到這一點),因為沖突的檢測和解決會增加應用程序的復雜性,增加處理負擔和網絡流量。
當前MSF本身對沖突這種問題也是提供了一些基礎層面上的支持的。下面是其定義的幾種沖突的基本類型(Conflict.ConflictType),它們包括:ClientInsertServerInsert:客戶端和服務器都插入了具有相同主鍵值的行。此操作導致了主鍵沖突。
ClientDeleteServerUpdate:客戶端刪除了服務器更新的行。
ClientUpdateServerDelete:服務器刪除了客戶端更新的行。
ClientUpdateServerUpdate:客戶端和服務器更新了相同的行。
ErrorsOccurred:客戶端或服務器存儲區(通常為數據庫)在應用更改時引發了一個異常。
Unknown:客戶端同步時提供程序能對所遇到的所有沖突進行分類,但服務器同步時不能提供程序。
如果要截獲沖突,可以通過對相應的SyncProvider對象中ApplyChangeFailed事件綁定來完成為,比如下面的示例代碼:
syncClientSyncProvider.ApplyChangeFailed+= new EventHandler<ApplyChangeFailedEventArgs>(syncClientSyncProvider_ApplyChangeFailed);