共用方式為


處理衝突

在同步處理期間,目的地提供者透過 ProcessChangeBatch (適用於 Managed 程式碼) or ProcessChangeBatch (適用於 Unmanaged 程式碼) 方法,接到來源提供者的變更批次。然後目的地提供者必須偵測並處理由於這份清單而發生的任何衝突。

衝突偵測

發生於同步處理中的衝突有兩大類別:並行衝突與條件約束衝突。

並行衝突

並行衝突是在變更的目的地複寫版本未包含於來源複寫的知識中時發生。這些衝突發生是因為更新與刪除及更新與更新等作業影響了正在進行同步處理的同一個項目。

一般來說,目的地提供者是使用 Sync Framework 所提供的變更套用者物件來偵測並行衝突。變更套用者是以 NotifyingChangeApplier 物件 (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplier 介面 (適用於 Unmanaged 程式碼) 代表。若要使用變更套用者來偵測變更,目的地提供者必須提供從來源提供者所傳送變更批次中每個項目的版本資訊。執行這項作業的兩種方式如下:

  • 目的地提供者會建立相對應於從來源提供者所傳送變更批次的變更清單。對於來源提供者變更批次中的每個項目,目的地提供者會在其包含目的地複寫上此項目版本的清單中加入一個項目。這份清單是傳遞給變更套用者。變更套用者使用這份清單來驗證每個項目的目的地版本是包含於來源複寫的知識中。

  • 目的地提供者不提供目的地版本清單給變更套用者,而是實作 TryGetDestinationVersion (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget::GetDestinationVersion (適用於 Unmanaged 程式碼) 方法。此方法會針對來源提供者之變更批次中的每個項目呼叫一次。

若要更進一步了解變更套用者偵測衝突所執行的作業,請考慮目的地提供者從來源提供者接到變更批次的案例。若要偵測衝突,必須為變更批次中的每個項目執行下列步驟:

  1. 目的地提供者會判斷項目之目的地複寫版本是否包含於來源複寫的知識中。

  2. 如果目的地複寫版本未包含於來源複寫的知識中,就認定物件發生了衝突。

條件約束衝突

條件約束衝突是違反在項目上所設條件約束 (例如資料夾的關聯性或檔案系統之中名稱完全相同之資料的位置) 的衝突。

由於偵測條件約束衝突取決於複寫所使用的資料存放區,這些衝突必須由提供者進行偵測。例如,代表階層式檔案系統的提供者必須能夠偵測在保存資料上所設定特屬存放區的條件約束,例如位置、命名、大小等等。

衝突解決

可以透過在工作階段期間,定義套用於所有衝突的衝突解決原則,或是處理每個衝突發生一次的事件,來解決衝突。

設定衝突解決原則

若要指定在工作階段期間套用於所有衝突的原則,應用程式要在目的地提供者的 ConflictResolutionPolicy 屬性 (適用於 Managed 程式碼) 或 ISyncSession::Start 方法 (適用於 Unmanaged 程式碼) 中指定衝突解決原則。

設定衝突解決動作

為了動態地針對所發生的每個衝突設定衝突解決動作,應用程式使用 ItemConflicting (適用於 Managed 程式碼) 或 ISyncCallback::OnConflict (適用於 Unmanaged 程式碼) 來處理項目衝突事件。此事件只在將衝突解決原則設定為 ApplicationDefined (適用於 Managed 程式碼) 或 CRP_NONE (適用於 Unmanaged 程式碼) 時引發。

Managed 程式碼:引發 ItemConflicting 時,事件處理常式會接到 ItemConflictingEventArgs 物件,其中包含衝突中兩個變更的中繼資料和項目資料。事件處理常式可以使用 SetResolutionAction 方法,檢查兩個衝突、對中繼資料或項目資料進行變更,並設定衝突的解決動作,然後 Sync Framework 會處理衝突,並適當地呼叫來源或目的地提供者,以套用任何變更。

Unmanaged 程式碼:引發 ISyncCallback::OnConflict 時,事件處理常式會接到 IChangeConflict 物件,其中包含衝突中兩個變更的中繼資料和項目資料。事件處理常式可以使用 IChangeConflict::SetResolveActionForChange 方法,檢查兩個衝突、對中繼資料或項目資料進行變更,並設定衝突的解決動作,然後 Sync Framework 會處理衝突,並適當地呼叫來源或目的地提供者,以套用任何變更。

衝突解決

Sync Framework 提供下列衝突解決動作,並執行其中大部分處理。其他衝突解決類型可以透過直接在項目衝突事件處理常式中配合衝突的變更來執行。

衝突解決 描述 可否做為工作階段原則或項目動作使用?

來源優先

來源複寫永遠都優先。這會支援唯讀同步處理方案,在其中不可信任目的地複寫。變更套用者會傳遞變更給 SaveItemChange (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget::SaveChange (適用於 Unmanaged 程式碼) 方法。變更是套用到目的地複寫上,跟任何非衝突的變更完全一樣。

兩者

目的地優先

目的地複寫永遠都優先。這會支援目的地複寫不取用由遠端用戶端所做變更的情形。變更套用者會傳遞衝突的變更給 SaveItemChange (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget::SaveChange (適用於 Unmanaged 程式碼) 方法做為僅限版本變更。只套用版本資訊到目的地複寫上的中繼資料。

兩者

合併式

從一個項目將資訊併入其他項目。變更套用者會傳遞衝突的變更給 SaveItemChange (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget::SaveChange (適用於 Unmanaged 程式碼) 方法做為合併式變更。來源項目資料和目的地項目資料會合併,而將結果套用至目的地複寫。

僅限項目動作

記錄檔

記錄衝突,稍後再處理,而且不套用變更。變更套用者會傳遞衝突變更給 SaveConflict (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget::SaveConflict (適用於 Unmanaged 程式碼) 方法。

僅限項目動作

延遲

忽略衝突,而且不套用變更。變更套用者不會傳遞衝突的變更給目的地提供者。

僅限項目動作

已儲存的衝突

記錄了衝突時,會呼叫 SaveConflict (適用於 Managed 程式碼) 或 SaveConflict (適用於 Unmanaged 程式碼) 方法,而不呼叫 SaveItemChange (適用於 Managed 程式碼) 或 SaveChange (適用於 Unmanaged 程式碼) 方法。在此情況下,提供者必須儲存衝突知識、衝突的變更,以及衝突資料。然後應用程式就可以從衝突記錄檔列舉這些衝突,並在稍後解決。請注意,這種衝突解決一定都是本機變更。因此,解決衝突的應用程式必須將解決套用為本機變更、更新滴答計數,並將衝突知識加入本機知識中。

此外,解決已儲存衝突的應用程式必須處理過時衝突。明確地說就是,當提供者記錄新衝突時,必須依據其知識檢查新衝突,以確保正在記錄的衝突會取代先前已為該項目記錄的衝突。過時衝突也必須從記錄檔清除。應用程式可以非同步方式清除過時衝突,而不是在提供者中清除。在此情況下,應用程式必須先驗證衝突並未過時,再嘗試解決該衝突。

使用變更單位減少衝突

使用變更單位來代表子項目變更可以減少衝突的數量。使用變更單位時,是為變更單位追蹤版本,而不是為整個項目追蹤。因此,在相同項目內對不同變更單位所做的變更不會導致衝突發生。如需詳細資訊,請參閱同步處理變更單位

請參閱

參考

ISyncKnowledge 介面
ISyncProvider 介面
IKnowledgeSyncProvider 介面
IKnowledgeSyncProvider::ProcessChangeBatch
ISynchronousNotifyingChangeApplierTarget 介面
IAsynchronousNotifyingChangeApplierTarget 介面
ISyncCallback::OnConflict
CONFLICT_RESOLUTION_POLICY 列舉
SYNC_RESOLVE_ACTION 列舉
SyncKnowledge
KnowledgeSyncProvider
INotifyingChangeApplierTarget
ItemConflicting
ConflictResolutionPolicy
ConflictResolutionAction

概念

同步處理提供者
套用變更
了解同步處理知識