共用方式為


偵測及解決條件約束衝突

條件約束衝突是違反在項目上所設之條件約束 (例如資料夾的關聯性或檔案系統之中名稱完全相同之資料的位置) 的衝突。Sync Framework 提供了可簡化條件約束衝突解決的變更套用者物件。

條件約束衝突是由目的地提供者在變更套用同步處理階段所偵測。當目的地提供者偵測到條件約束衝突時,它會將衝突報告給變更套用者。變更套用者會根據針對此工作階段所設定的衝突解決原則,或是應用程式針對指定之衝突所設定的衝突解決動作,解決此衝突。然後,變更套用者就會將任何必要的呼叫分派給目的地提供者,讓目的地提供者能夠將解決的衝突套用至目的地複寫。

當提供者報告條件約束衝突並使用變更套用者時,它也必須提供一個衝突記錄檔,變更套用者會使用此記錄檔來處理及記錄衝突。Sync Framework 會針對未實作自己之衝突記錄檔的提供者提供衝突記錄檔的記憶體內實作。如需詳細資訊,請參閱記錄及管理衝突

請注意,使用自訂篩選或變更套用服務的提供者不可使用條件約束衝突,否則可能會發生無法預期的結果。

條件約束衝突的種類

條件約束衝突取決於目的地複寫所使用的資料存放區,所以有許多形式。Sync Framework 將條件約束衝突分成以下三種。

  • 衝突」(Collision Conflict) 發生於因為某個項目與目的地存放區中的其他項目衝突而無法儲存該項目時,例如當來源提供者所傳送的檔案與已經存在目的地複寫中的檔案具有相同名稱和位置時。

  • 遺失父系衝突」(Missing Parent Conflict) 發生於因為某個項目需要的父項目不存在,而無法將此項目儲存在階層式資料存放區時,例如當來源提供者傳送的檔案要儲存於目的地複寫中所不存在的目錄時。

  • 其他條件約束衝突發生於要儲存的項目違反目的地複寫的條件約束時,例如來源提供者傳送的檔案太大,而無法儲存在目的地複寫上,或是此變更違反目的地複寫上的某個商務邏輯時。以商務邏輯衝突為例,請考慮儲存兩個變更單位的低精確度複寫:name 和 country。此外,請考慮儲存三個變更單位的高精確度複寫:name、state/province 和 country。高精確度複寫所包含的商務邏輯會根據 country 欄位檢查 state/province 欄位,而且不會儲存未通檢查的變更。低精確度複寫會當做來源並且傳送 country 設定為 "USA" 的項目。雖然目的地提供者會嘗試將變更套用至高精確度複寫,不過在高精確度複寫上,此項目的 state/province 欄位包含 "British Columbia"。因此,此變更違反商務邏輯,而且會造成條件約束衝突。

目的地提供者會從下列值選取,指定條件約束衝突的原因。

條件約束衝突的原因 描述

Collision (適用於 Managed 程式碼)、CCR_COLLISION (適用於 Unmanaged 程式碼)

此項目因為與存放區中的其他項目發生衝突而無法儲存,例如,擁有與現有項目相同的名稱。提供者必須將目的地項目的識別碼指定為發生衝突的項目識別碼。

NoParent (適用於 Managed 程式碼)、CCR_NOPARENT (適用於 Unmanaged 程式碼)

此項目因為需要的父項目不存在於存放區中,而無法儲存到階層式資料存放區中。提供者可以選擇性地將遺漏父項目的識別碼指定為發生衝突的項目識別碼。

Other (適用於 Managed 程式碼)、CCR_OTHER (適用於 Unmanaged 程式碼)

項目或變更單位違反目的地複寫的某個其他條件約束。提供者可以選擇性地將發生衝突之項目的識別碼指定為發生衝突的項目識別碼。

偵測及報告條件約束衝突

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

條件約束衝突是由目的地提供者在變更套用同步處理階段所偵測。

Managed 程式碼:條件約束衝突通常是由目的地提供者在其 SaveItemChangeSaveChangeWithChangeUnits 方法中偵測,並藉由呼叫 RecordConstraintConflictForItemRecordConstraintConflictForChangeUnit 來報告。

Unmanaged 程式碼:條件約束衝突通常是由目的地提供者在其 ISynchronousNotifyingChangeApplierTarget::SaveChangeISynchronousNotifyingChangeApplierTarget::SaveChangeWithChangeUnits 方法中偵測,並藉由呼叫 ISaveChangeContext2::SetConstraintConflictOnChangeISaveChangeWithChangeUnitsContext2::SetConstraintConflictOnChangeUnit 來報告。

當變更套用者收到條件約束衝突報告時,它會採取幾個動作:

  • 當條件約束衝突為衝突 (Collision Conflict) 時,變更套用者會判斷此衝突為新的衝突、暫時性衝突或是合併解決方案傳播。在衝突處理期間,變更套用者可能會暫時將衝突儲存在衝突記錄檔中,其方式是呼叫 SaveConstraintConflict (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget2::SaveConstraintConflict (適用於 Unmanaged 程式碼)。在同步處理工作階段結束時,變更套用者會從衝突記錄檔中移除暫時性衝突。

  • 根據針對此工作階段所設定的衝突解決原則,或是根據應用程式決定的衝突解決動作來解決衝突。當衝突解決原則設定為 ApplicationDefined (適用於 Managed 程式碼) 或 CCRP_NONE (適用於 Unmanaged 程式碼) 時,將會呼叫應用程式來判斷衝突解決動作。

  • 根據應用程式所決定的衝突解決動作來解決非衝突性的條件約束衝突。非衝突性的條件約束衝突不能設定衝突解決原則。

解決條件約束衝突

變更套用者會幫助目的地提供者解決條件約束衝突,其方式是分派此提供者指定之變更套用者目標物件的呼叫。當指定衝突解決原則時,變更套用者會使用此原則來判斷每當發生衝突時所要採取的正確衝突解決動作。當指定了自訂衝突解決方案時,變更套用者會通知同步處理應用程式有關衝突的資訊,而且此應用程式會指定衝突解決動作。無法針對非衝突性條件約束衝突指定衝突解決原則,所以當報告非衝突性條件約束衝突時,變更套用者一定會通知應用程式,好讓該應用程式可以指定衝突解決動作。在所有情況下,變更套用者會呼叫適當的變更套用者目標方法,而變更套用者目標物件會執行動作,例如將變更儲存到複寫或是記錄衝突以供日後處理。

指定衝突解決原則

同步處理應用程式在啟動同步處理之前,通常會指定衝突解決原則。

Managed 程式碼:應用程式會指定原則,其方式是將目的地提供者的 CollisionConflictResolutionPolicy 屬性設定為所要的值。

Unmanaged 程式碼:應用程式會使用自訂機制來指定原則,例如應用程式在目的地提供者物件上呼叫 QueryInterface 所取得的自訂介面。

目的地提供者會將衝突解決原則傳遞給變更套用者的 ApplyChanges (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplier2::ApplyChanges (適用於 Unmanaged 程式碼) 方法,好讓變更套用者可以將方法正確分派給變更套用者目標。變更套用者目標是由 INotifyingChangeApplierTarget2 (適用於 Managed 程式碼) 或 ISynchronousNotifyingChangeApplierTarget2 (適用於 Unmanaged 程式碼) 物件所表示。

Managed 程式碼的衝突解析原則

Sync Framework 會針對 Managed 程式碼定義下列衝突解析原則。

衝突解決原則 描述

SourceWins

來源複寫上所做的變更永遠優先。Sync Framework 會指定 SourceWins 的衝突解決動作。

DestinationWins

目的地複寫上所做的變更永遠優先。Sync Framework 會指定 DestinationWins 的衝突解決動作。

RenameSource

從來源提供者傳送的變更會重新命名,讓它不再與目的地複寫的衝突項目發生衝突,而且來源變更會套用至目的地複寫。Sync Framework 會指定 RenameSource 的衝突解決動作。

RenameDestination

目的地複寫的衝突項目會重新命名,讓它不再與來源提供者所傳送的變更發生衝突,而且來源變更會套用至目的地複寫。Sync Framework 會指定 RenameDestination 的衝突解決動作。

Merge

來源項目的資料會與目的地項目結合。Sync Framework 會指定 Merge 的衝突解決動作。

ApplicationDefined

變更套用者會在發生每個衝突時,使用 ItemConstraint 事件來通知同步處理應用程式。應用程式會檢查發生衝突的項目,並呼叫 SetResolutionAction 來指定衝突解決動作。

Unmanaged 程式碼的衝突解析原則

Sync Framework 會針對 Unmanaged 程式碼定義下列衝突解析原則。

衝突解決原則 描述

CCRP_SOURCE_PROVIDER_WINS

來源複寫上所做的變更永遠優先。Sync Framework 會指定 SCRA_ACCEPT_SOURCE_PROVIDER 的衝突解決動作。

CCRP_DESTINATION_PROVIDER_WINS

目的地複寫上所做的變更永遠優先。Sync Framework 會指定 SCRA_ACCEPT_DESTINATION_PROVIDER 的衝突解決動作。

CCRP_RENAME_SOURCE

來源提供者所傳送的變更會重新命名,讓它不再與目的地複寫的衝突項目發生衝突,而且來源變更會套用至目的地複寫。Sync Framework 會指定 SCRA_RENAME_SOURCE 的衝突解決動作。

CCRP_RENAME_DESTINATION

目的地複寫的衝突項目會重新命名,讓它不再與來源提供者所傳送的變更發生衝突,而且來源變更會套用至目的地複寫。Sync Framework 會指定 SCRA_RENAME_DESTINATION 的衝突解決動作。

CCRP_MERGE

來源項目的資料會與目的地項目結合。Sync Framework 會指定 SCRA_MERGE 的衝突解決動作。

CCRP_NONE

變更套用者會在發生每個衝突時,使用 ISyncConstraintCallback::OnConstraintConflict 事件來通知同步處理應用程式。應用程式會檢查發生衝突的項目,並呼叫 IConstraintConflict::SetConstraintResolveActionForChangeIConstraintConflict::GetConstraintResolveActionForChangeUnit 來指定衝突解決動作。

指定自訂衝突解決方案

應用程式可以指示,它將會針對發生的每一個條件約束衝突來指定衝突解決動作。為了完成這項處理,應用程式會註冊來接收條件約束衝突的通知。當報告條件約束衝突時,Sync Framework 會通知應用程式。然後應用程式可以分析衝突,並設定所需的衝突解決動作。

使用 Managed 程式碼來指定自訂衝突解決方案

若要接收衝突的通知,應用程式會在啟動同步處理之前,先執行下列動作。

  • 針對目的地提供者的 ItemConstraint 事件註冊事件處理常式。

  • 將目的地提供者的 CollisionConflictResolutionPolicy 屬性設定為 ApplicationDefined

如果應用程式已經執行這些步驟,每當同步處理期間報告條件約束衝突時,變更套用者都會引發 ItemConstraint 事件一次。

因為無法針對非衝突性條件約束衝突指定衝突解決原則,所以變更套用者也會針對每個報告的非衝突性條件約束衝突引發 ItemConstraint 事件一次。

ItemConstraint 事件的事件處理常式會接收 ItemConstraintEventArgs 物件,其中包含衝突中兩個變更的中繼資料和項目資料。此事件處理常式可以檢查衝突中的兩個變更、對中繼資料或項目資料進行變更,並使用 SetResolutionAction 方法來設定衝突的解決動作。然後變更套用者會處理衝突,並分派變更套用者目標物件的適當呼叫。請注意,當條件約束衝突不是衝突 (Collision) 時,唯一有效的衝突解決動作就是 SaveConflictSkipChange

Sync Framework 提供下列條件約束衝突解決動作集合,變更套用者會針對這些動作集合處理大部分的工作。

衝突解決動作 描述 對衝突類型有效

SourceWins

來源複寫上所做的變更優先。變更套用者會將變更傳遞至 SaveItemChange 方法,並指定 DeleteConflictingAndSaveSourceItem 的儲存動作。來源變更會套用至目的地複寫,而且會從目的地複寫中刪除衝突的目的地項目。

僅限衝突。

DestinationWins

目的地複寫上所做的變更優先。變更套用者會將來源變更傳遞至 SaveItemChange 方法,並指定 DeleteAndStoreTombstone 的儲存動作。目的地提供者會建立來源變更的標記。當目的地當做日後同步處理的來源使用時,它會列舉代表來源項目刪除的變更,因此將其從同步處理社群中移除。

僅限衝突。

RenameSource

從來源提供者所傳送的變更會重新命名,讓它不再與目的地複寫的衝突項目發生衝突,而且來源變更會套用至目的地複寫。變更套用者會將變更傳遞至 SaveItemChange 方法,並指定 RenameSourceAndUpdateVersionAndData 的儲存動作。

僅限衝突。

RenameDestination

目的地複寫的衝突項目會重新命名,讓它不再與從來源提供者所傳送的變更發生衝突,而且來源變更會套用至目的地複寫。變更套用者會將變更傳遞至 SaveItemChange 方法,並指定 RenameDestinationAndUpdateVersionData 的儲存動作。

僅限衝突。

Merge

來源項目的資料會與目的地項目結合。變更套用者會將來源複寫的變更資料傳遞至 SaveItemChange 方法,並指定 ChangeIdUpdateVersionAndMergeData 的儲存動作。如需詳細資訊,請參閱底下的合併衝突項目。

僅限衝突。

SaveConflict

記錄衝突,而且不套用變更。變更套用者會將衝突資料傳遞至 SaveConstraintConflict 方法,將衝突儲存在衝突記錄檔中。如需記錄衝突的詳細資訊,請參閱記錄及管理衝突

所有條件約束衝突。

SkipChange

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

所有條件約束衝突。

使用 Unmanaged 程式碼來指定自訂衝突解決方案

若要接收衝突的通知,應用程式會在啟動同步處理之前,先執行下列動作。

如果應用程式已經執行這些步驟,每當同步處理期間報告條件約束衝突時,變更套用者都會呼叫 OnConstraintConflict 方法一次。

因為無法針對非衝突性條件約束衝突指定衝突解決原則,所以變更套用者也會針對每個報告的非衝突性條件約束衝突呼叫 OnConstraintConflict 方法一次。

OnConstraintConflict 方法會接收 IConstraintConflict 物件,其中包含衝突中兩個變更的中繼資料和項目資料。此方法可以檢查衝突中的兩個變更、對中繼資料或項目資料進行變更,並使用 IConstraintConflict::SetConstraintResolveActionForChangeIConstraintConflict::GetConstraintResolveActionForChangeUnit 方法來設定衝突的解決動作。然後變更套用者會處理衝突,並分派變更套用者目標物件的適當呼叫。請注意,當條件約束衝突不是衝突 (Collision) 時,唯一有效的衝突解決動作就是 SCRA_TRANSFER_AND_DEFERSCRA_DEFER

Sync Framework 提供下列條件約束衝突解決動作集合,變更套用者會針對這些動作集合處理大部分的工作。

衝突解決原則 描述 對內容類型有效

SCRA_ACCEPT_SOURCE_PROVIDER

來源複寫上所做的變更永遠優先。變更套用者會將變更傳遞至 ISynchronousNotifyingChangeApplierTarget::SaveChange 方法,並指定 SSA_DELETE_CONFLICTING_AND_SAVE_SOURCE_ITEM 的儲存動作。來源變更會套用至目的地複寫,而且會從目的地複寫中刪除衝突的目的地項目。

僅限衝突。

SCRA_ACCEPT_DESTINATION_PROVIDER

目的地複寫上所做的變更永遠優先。變更套用者會將來源變更傳遞至 SaveChange 方法,並指定 SSA_DELETE_AND_STORE_TOMBSTONE 的儲存動作。目的地提供者會建立來源變更的標記。當目的地當做日後同步處理的來源使用時,它會列舉代表來源項目刪除的變更,因此將其從同步處理社群中移除。

僅限衝突。

SCRA_RENAME_SOURCE

從來源提供者所傳送的變更會重新命名,讓它不再與目的地複寫的衝突項目發生衝突,而且來源變更會套用至目的地複寫。變更套用者會將變更傳遞至 SaveChange 方法,並指定 SSA_RENAME_SOURCE_AND_UPDATE_VERSION_AND_DATA 的儲存動作。

僅限衝突。

SCRA_RENAME_DESTINATION

目的地複寫的衝突項目會重新命名,讓它不再與從來源提供者所傳送的變更發生衝突,而且來源變更會套用至目的地複寫。變更套用者會將變更傳遞至 SaveChange 方法,並指定 SSA_RENAME_DESTINATION_AND_UPDATE_VERSION_AND_DATA 的儲存動作。

僅限衝突。

SCRA_MERGE

來源項目的資料會與目的地項目結合。變更套用者會將來源複寫的變更資料傳遞至 SaveChange 方法,並指定 SSA_CHANGE_ID_UPDATE_VERSION_AND_MERGE_DATA 的儲存動作。如需詳細資訊,請參閱底下的合併衝突項目。

僅限衝突。

SCRA_TRANSFER_AND_DEFER

記錄衝突,而且不套用變更。變更套用者會將衝突資料傳遞至 ISynchronousNotifyingChangeApplierTarget2::SaveConstraintConflict 方法,將衝突儲存在衝突記錄檔中。如需記錄衝突的詳細資訊,請參閱記錄及管理衝突

所有條件約束衝突。

SCRA_DEFER

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

所有條件約束衝突。

合併衝突項目

合併條件約束衝突中的兩個項目與合併並行衝突中的項目不同,因為牽涉到條件約束衝突的這兩個項目具有不同的項目識別碼。例如,在複寫上建立名為 "FavoriteBooks.txt" 的檔案,並為它提供 id1 項目識別碼。也會在另一個複寫上建立名為 "FavoriteBooks.txt" 的檔案,並為它提供 id2 項目識別碼。當同步處理這兩個複寫時,Sync Framework 會將這兩個項目視為不同的項目,因為它們具有不同的項目識別碼,但是目的地複寫會將這兩者視為相同的項目,因為它們具有相同的名稱。因此,目的地提供者會報告衝突,並指定應該合併這兩個項目的內容。變更套用者會指派 id1 合併項目識別碼,並指定目的地複寫必須儲存 id2 的合併標記。

當透過合併的方式來解決衝突時,必須選取其中一個項目識別碼當做要指派給合併項目的成功項目識別碼,並適當追蹤失敗的項目識別碼是否已經合併。變更套用者會選取成功項目識別碼,其方式是比較兩個項目識別碼,並選取較小的識別碼當做成功識別碼。成功項目識別碼是用來識別目的地複寫中的合併項目。建立「合併標記」(Merge Tombstone) 並將其儲存在目的地複寫上。合併標記會追蹤失敗項目識別碼與成功項目識別碼在同步處理社群中識別相同的項目。合併標記的中繼資料與已刪除項目標記的中繼資料相同,而且加入了成功項目識別碼。

Managed 程式碼:當變更解決動作為 Merge 時,變更套用者會呼叫 SaveItemChange,並指定 ChangeIdUpdateVersionAndMergeData 的儲存動作。變更套用者會傳遞變更,並將失敗的項目識別碼當做 change 參數。您可以呼叫傳入 context 參數內之 SaveChangeContext 物件的 GetWinnerChange 方法,取得具有成功項目識別碼的變更。

Unmanaged 程式碼:當變更解決動作為 SCRA_MERGE 時,變更套用者會呼叫 ISynchronousNotifyingChangeApplierTarget::SaveChange,並指定 SSA_CHANGE_ID_UPDATE_VERSION_AND_MERGE_DATA 的儲存動作。變更套用者會傳遞變更,並將失敗的項目識別碼當做 pChange 參數。您可以呼叫傳入 pSaveContext 參數內之 ISaveChangeContext2 物件的 ISaveChangeContext2::GetWinnerChange 方法,取得具有成功項目識別碼的變更。

目的地提供者必須執行幾個步驟來適當處理合併動作。請考慮採用將 id1 指定為失敗項目識別碼而將 id2 指定為成功項目識別碼的合併動作。目的地提供者必須在一筆交易中執行下列步驟。

  1. 將合併標記儲存在目的地中繼資料中。合併標記會包含 id1 當做失敗項目識別碼,而包含 id2 當做成功項目識別碼。如果合併標記已經存在於目的地複寫中,此複寫包含了 id1 當做失敗項目識別碼而包含另一個項目識別碼 id3 當做成功項目識別碼,則提供者會執行下列步驟。

    1. 如果 id2 大於 id3,此提供者會建立及儲存兩個合併標記。第一個合併標記會包含 id1 當做失敗項目識別碼,而包含 id2 當做成功項目識別碼。另一個合併標記會包含 id2 當做失敗項目識別碼,而包含 id3 當做成功項目識別碼。第二個合併標記可能已經存在,在此情況下,只要保留此標記即可。如此一來,系統就會建立合併標記的鏈結,並依照項目識別碼的遞減順序排序。

    2. 如果 id3 大於 id2,提供者會傳回錯誤。

  2. 將目的地複寫中項目的資料與來源提供者中項目的資料合併起來。目的地項目可由 id1 或 id2 所識別。

  3. 使用成功項目識別碼 id2 當做合併變更的項目識別碼,將變更的中繼資料套用到目的地中繼資料,並將變更的合併資料套用到目的地項目存放區。可以呼叫 context 的 GetWinnerChange 方法 (適用於 Managed 程式碼) 或是 pContext 的 GetWinnerChange 方法 (適用於 Unmanaged 程式碼) 來取得變更的中繼資料。

傳播合併的項目

傳播條件約束衝突中的合併項目與傳播並行衝突中的合併項目不同,因為衝突可能發生於成功項目識別碼、失敗項目識別碼或兩者皆是。例如,複寫 X 包含了識別碼為 id1 的項目,該項目是從識別碼為 id1 和 id2 的項目合併而來。複寫 Y 包含了識別碼為 id2 的項目,而且已經對此項目進行本機變更。當 id1 所識別的合併項目從複寫 X 傳送到複寫 Y 時,將會發生衝突,因為 id1 現在指的是與 id2 相同的項目。

變更套用者會幫助目的地提供者套用合併的項目變更,其方式是偵測同時發生在成功項目識別碼與失敗項目識別碼的並行衝突,以及判斷目的地提供者將合併的項目變更套用到目的地複寫所必須採取的正確動作。如果目的地提供者在套用合併的項目變更時,偵測到條件約束衝突,它必須報告此條件約束衝突,就像其他任何條件約束衝突一樣。

當來源複寫與目的地複寫對於項目的識別有不同意見時,變更套用者也會偵測到。例如,複寫 X 會合併項目並將 id1 指派給合併的項目,藉以解決識別碼為 id1 和 id2 之項目間的衝突。複寫 Y 會重新命名 id1 所識別的項目並同時保留兩個項目,藉以解決識別碼為 id1 和 id2 之項目間的衝突。複寫 X 會傳送 id1 所識別之合併的項目,以及指出 id2 已合併到 id1 中的合併標記。系統會在 id1 上偵測到衝突,並當做並行衝突解決。系統在 id2 上偵測到衝突,並透過指定 Identity (適用於 Managed 程式碼) 或 CCR_IDENTITY (適用於 Unmanaged 程式碼) 的衝突原因,將同步處理應用程式回報為識別碼衝突。應用程式會決定是透過保留來源變更還是目的地變更來解決衝突。

請注意,如果來源提供者使用變更單位篩選而目的地提供者為未篩選時,即使由合併標記識別的項目即將從目的地複寫移除,有時仍可能發生識別衝突。發生這種情況是因為變更套用者處理篩選知識的方式所造成。為確保正確的同步處理及合併標記傳播,目的地提供者必須保存合併標記並且從目的地複寫移除衝突的項目。

當來源提供者傳送合併的項目變更時,變更套用者會判斷目的地提供者將變更套用到目的地複寫所必須採取的正確動作。下表列出變更套用者可以指定的儲存動作,以及提供者套用變更所必須採取的動作。

儲存動作 提供者動作

ChangeIdUpdateVersionAndSaveData (適用於 Managed 程式碼)、SSA_CHANGE_ID_UPDATE_VERSION_AND_SAVE_DATA (適用於 Unmanaged 程式碼)

遵循上面合併衝突項目所述的相同步驟來執行,儲存失敗項目識別碼的合併標記。套用成功的項目變更。

ChangeIdUpdateVersionOnly (適用於 Managed 程式碼)、SSA_CHANGE_ID_UPDATE_VERSION_ONLY (適用於 Unmanaged 程式碼)

遵循上面合併衝突項目所述的相同步驟來執行,儲存失敗項目識別碼的合併標記。僅套用成功項目變更的中繼資料。

ChangeIdUpdateVersionAndDeleteAndStoreTombstone (適用於 Managed 程式碼)、SSA_CHANGE_ID_UPDATE_VERSION_AND_DELETE_AND_STORE_TOMBSTONE (適用於 Unmanaged 程式碼)

遵循上面合併衝突項目所述的相同步驟來執行,儲存失敗項目識別碼的合併標記。刪除成功項目識別碼所識別的項目,並且儲存其標記。

StoreMergeTombstone (適用於 Managed 程式碼)、SSA_STORE_MERGE_TOMBSTONE (適用於 Unmanaged 程式碼)

遵循上面合併衝突項目所述的相同步驟來執行,儲存失敗項目識別碼的合併標記。

注意

儲存動作中的所有步驟都必須當做不可部分完成的動作來套用。

請參閱

參考

ISaveChangeContext2 介面
ISaveChangeWithChangeUnitsContext2 介面
ISynchronousNotifyingChangeApplier2 介面
ISynchronousNotifyingChangeApplierTarget2 介面
SaveChangeContext
SaveChangeWithChangeUnitsContext
NotifyingChangeApplier
INotifyingChangeApplierTarget2

概念

處理衝突
偵測及解決並行衝突