記錄及管理衝突
在同步處理期間,同步處理應用程式可能會指出某項衝突必須儲存在衝突記錄檔中,而非立即解決。然後,您可以透過使用衝突記錄檔,與同步處理分開解決衝突,讓同步處理能夠盡可能有效率地完成。
透過記錄解決衝突
若要指出即將儲存某項並行衝突,應用程式會將衝突解決動作設定為 SaveConflict (適用於 Managed 程式碼) 或 SRA_TRANSFER_AND_DEFER (適用於 Unmanaged 程式碼)。若要指出即將儲存某項條件約束衝突,應用程式會將衝突解決動作設定為 SaveConflict (適用於 Managed 程式碼) 或 SCRA_TRANSFER_AND_DEFER (適用於 Unmanaged 程式碼)。
記錄衝突
若要記錄並行衝突,變更套用者會呼叫 SaveConflict (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget::SaveConflict (適用於 Unmanaged 程式碼)。在這種方法中,提供者會儲存衝突變更的中繼資料、衝突變更的資料,以及指定的衝突知識。
若要記錄條件約束衝突,變更套用者會呼叫 SaveConstraintConflict (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget2::SaveConstraintConflict (適用於 Unmanaged 程式碼)。在這種方法中,提供者會儲存衝突變更的中繼資料、衝突變更的資料、目的地複寫中衝突項目的識別碼、衝突的原因,以及指定的衝突知識。
在衝突記錄檔中儲存衝突之前,提供者必須確定此衝突不會由已經存在衝突記錄檔中的另一項變更所取代。達成此目的的其中一種方式就是使用 Combine 方法 (適用於 Managed 程式碼) 或 ISyncKnowledge::Union 方法 (適用於 Unmanaged 程式碼) 來結合記錄檔中所有衝突的衝突知識,藉以建立記錄檔知識。如果新的衝突包含在記錄檔知識中,表示此衝突已過時而且不應該新增至記錄檔。您可以視需要建立此記錄檔知識,也可以與衝突記錄檔一起儲存此記錄檔知識。如果已儲存記錄檔知識,就必須在新增衝突時使用 Combine (適用於 Managed 程式碼) 或 Union (適用於 Unmanaged 程式碼) 來更新此知識。同樣地,如果已移除衝突,就必須使用 Complement (適用於 Managed 程式碼) 或 ISyncKnowledge2::Complement (適用於 Unmanaged 程式碼) 來更新記錄檔知識。
移除已過時的衝突
若要避免衝突記錄檔成長得太大,您必須從衝突記錄檔中移除已過時的衝突。
完成偵測和移除過時衝突最簡單的方式就是使用 Sync Framework 的變更套用者元件。若要將衝突記錄檔連接到變更套用者,提供者或衝突記錄檔會實作 IConflictLogAccess 和 IConflictLogWriter 介面 (適用於 Managed 程式碼) 或 IConflictLogAccess 和 IConflictLogWriter 介面 (適用於 Unmanaged 程式碼)。衝突記錄檔會傳遞至變更套用者,其方式是使用
ApplyChanges 方法 (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplier2::ApplyChanges 方法 (適用於 Unmanaged 程式碼)。當衝突記錄檔傳遞給變更套用者時,變更套用者會在每個變更批次結束時,偵測並移除記錄檔中的過時衝突。
對於沒有連接到變更套用者的衝突記錄檔,此衝突記錄檔必須自行管理已過時的衝突。當某個衝突新增至衝突記錄檔,以便取代位於記錄檔中的衝突時,此衝突可能會成為已過時。偵測這種情況的其中一種方式就是根據新衝突的衝突知識,測試記錄檔中每個衝突的變更版本。當某個衝突的變更版本包含在新衝突的衝突知識中時,現有的衝突就已過時,而且必須從記錄檔中移除此衝突。當某個變更套用至複寫,以便取代位於記錄檔中的衝突時,此衝突可能也會成為已過時。偵測這種情況的其中一種方式就是在套用每個變更批次之後,根據複寫的知識,測試記錄檔中每個衝突的變更版本。您可以在同步處理工作階段期間或其他時間內執行偵測和解決過時衝突的作業。
解決記錄檔中的衝突
您可以在同步處理工作階段期間或其他時間內解決衝突記錄檔中的衝突。不過,您不應該在變更套用期間解決衝突記錄檔中的衝突,否則可能會發生無法預期的結果。
當記錄檔中的衝突套用至複寫時,您必須將它視為本機變更。若要解決衝突記錄檔中的衝突,應用程式或提供者會執行下列步驟:
累加複寫的滴答計數。
更新項目或變更單位的變更版本,以便使用更新的滴答計數來反映本機複寫所進行的變更。
使用 Combine (適用於 Managed 程式碼) 或 Union (適用於 Unmanaged 程式碼) 來結合複寫的知識與衝突的知識,然後將結合的知識儲存成複寫的新知識。
將變更資料套用至複寫。
從衝突記錄檔中移除衝突。
記憶體中的衝突記錄檔
當提供者報告條件約束衝突時,就需要使用衝突記錄檔。若要協助針對沒有包含衝突記錄檔之複寫報告條件約束衝突的提供者,Sync Framework 會提供在記憶體中運作的衝突記錄檔介面實作,並且將此實作用來儲存由於條件約束衝突處理而可能會引發的暫時衝突。此實作是 MemoryConflictLog 類別 (適用於 Managed 程式碼) 或 IMemoryConflictLog 介面,該介面可藉由呼叫 IProviderSyncServices2::CreateMemoryConflictLog (適用於 Unmanaged 程式碼) 來取得。
記憶體中的衝突記錄檔實作也可以搭配持續性衝突記錄檔使用。記憶體中的衝突記錄檔可用來改善效能,方法是將它用於提供完整衝突記錄檔的記憶體中快取以及處理暫時衝突。當持續性衝突記錄檔鏈結至記憶體中的衝突記錄檔時,您可以在同步處理完成之後,透過呼叫 Persist (適用於 Managed 程式碼) 或 IMemoryConflictLog::Persist (適用於 Unmanaged 程式碼),將衝突儲存至持續性衝突記錄檔。