共用方式為


管理標記

標記表示已從複寫中刪除的項目。標記主要是協助保護而避免將已刪除項目重新導入複寫中。為了避免可能會發生的效能或儲存問題,標記必須定期清除。這項清除作業應該小心進行管理,以免重新導入已刪除項目。

表示標記

複寫可以使用任何方法來追蹤已刪除項目。若要執行這項作業,建議讓複寫使用標記位元或標記記錄檔。

標記位元

複寫會定義項目的中繼資料要包含布林值,以指出此項目是否已經從項目存放區中刪除。項目刪除時,此值會在該項目的中繼資料項目內設定為 true。如果必須追蹤大批已刪除項目,使用標記位元在儲存時會很有效率,因為每個項目只需再加一個位元,但是在列舉或清除標記時,這種方法效率較低,因為必須搜尋整個中繼資料存放區。

標記記錄檔

複寫另外會維護一個記錄檔,其中列出已經從項目存放區中刪除的項目。項目刪除時,就會在標記記錄檔中加一項記錄。如果必須追蹤大批已刪除項目,使用標記記錄檔進行儲存則效率不佳,因為記錄檔必須包含每個已刪除項目的識別碼,但是在列舉或清除標記時,這種方法就很有效率,因為這份清單只包含已刪除項目。

標記清除

同步處理社群中的每個複寫只包含有關其本身狀態的知識,而不包含任何其他複寫的狀態。因此,很難判斷何時標記已在整個社群中進行複寫。所以,對於任何特定複寫,決定清除標記的時機和方式完全是本機決策。例如,標記可以根據本機時間戳記或空間需求加以清除。複寫可以訂定原則,讓標記不可佔據超過資料集的百分之十。

清除標記之後,複寫不知道刪除作業,但仍然必須在本身或其他複寫的存放區中,防止重新導入該項目。為了協助防止發生此問題,會在複寫的中繼資料存放區中保存每個項目的建立版本和複寫的被遺忘知識。當複寫清除標記時,必須在其被遺忘的知識中記錄標記版本。

使用 Managed 程式碼記錄清除標記

若要為已從複寫之中繼資料存放區移除的刪除項目記錄中繼資料,請在複寫的 ForgottenKnowledge 物件上呼叫 ForgetTo。此方法需要已刪除項目的版本。

使用 Unmanaged 程式碼記錄清除標記

若要為已從複寫之中繼資料存放區移除的刪除項目記錄中繼資料,請在複寫的 IForgottenKnowledge 物件上呼叫 IForgottenKnowledge::ForgetToVersion。此方法需要已刪除項目的版本。

提供被遺忘知識給 Sync Framework

如果複寫使用被遺忘的知識追蹤清除標記,其相關聯提供者必須提供被遺忘的知識給需要此知識的 Sync Framework 方法,例如 ChangeBatch (適用於 Managed 程式碼) 或 IProviderSyncServices::CreateChangeBatch (適用於 Unmanaged 程式碼)。提供者也必須在同步處理期間,儲存被遺忘的知識和已更新的知識,例如儲存在其 StoreKnowledgeForScope 方法 (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget::SaveKnowledge 方法 (適用於 Unmanaged 程式碼) 中。

如果複寫不清除標記,也不維護被遺忘的知識,其相關聯的提供者就必須傳遞 null (適用於 Managed 程式碼) 或 NULL (適用於 Unmanaged 程式碼) 給具有被遺忘的知識參數之 Sync Framework 方法。

標記相關案例

請考量兩種標記相關案例:要求同步處理的過時複寫,以及傳送更新至已刪除項目的複寫,這兩種案例 Sync Framework 都會偵測。

偵測過時複寫

在此案例中,目的地複寫相對於來源複寫來說已過時。由於來源複寫已清除其標記,因此會有來源複寫已經不知道的刪除作業。所以,來源提供者無法將代表這些刪除作業的變更傳送給目的地提供者。套用變更之前,Sync Framework 會比較來源複寫的被遺忘知識與目的地複寫的目前知識。如果目的地知識不包含被遺忘的知識,Sync Framework 會將目的地複寫識別為過時,並開始復原同步處理。

如果應用程式已註冊事件處理常式,Sync Framework 會給應用程式機會,以繼續或停止完整列舉。在 Managed 程式碼中,會引發 FullEnumerationNeeded 事件。在 Unmanaged 程式碼中,應用程式會接到 ISyncCallback::OnFullEnumerationNeeded 回呼。

如果應用程式尚未註冊事件處理常式,會自動發生完整列舉。完整列舉能讓 Sync Framework 比較來源提供者的變更與目的地複寫中的項目,然後判斷目的地複寫必須刪除哪些項目。目的地複寫中任何項目如果沒有來源提供者的相對應變更,就會從目的地複寫刪除。

偵測已刪除項目的更新

在此案例中,來源複寫相對於目的地複寫來說已過時。當來源複寫從上次目的地複寫清除其標記以來,尚未進行過同步處理時,就會發生這種情形。在目的地複寫上刪除項目後,接著將其標記從目的地複寫清除,然後又在來源複寫上更新該項目時,可能會發生一個問題。該項目會出現在來源提供者傳送至目的地提供者的變更批次中。目的地提供者必須識別此項目已非新項目,否則該項目就會不正確地重新導入目的地複寫中。

請注意,來源複寫中該項目的目前版本並不適合用來與目的地複寫中的目前知識進行比較,因為將會重新導入之項目的目前版本並未包含於目的地複寫的目前知識中。此時應該用來源複寫中該項目的建立版本與目的地複寫中的目前知識進行比較,以判斷目的地複寫之前是否知道該項目。由於該項目的刪除一定是在該項目建立之後才會發生,而目的地複寫的目前知識包含刪除作業,目前的知識也一定會包含建立作業。

所以在將新項目加入目的地複寫之前,Sync Framework 會將該項目的建立版本與目的地複寫的目前知識進行比較。如果目的地知識中包含項目的建立版本,則表示之前知道該項目,但是已刪除及遺忘該項目,該項目即視為更新與刪除衝突處理。

請參閱

參考

ISyncCallback::OnFullEnumerationNeeded
FullEnumerationNeeded

概念

管理標準提供者的中繼資料