共用方式為


使用開放式並行存取,減少可能資料遺失

 

發行︰ 2017年1月

適用於: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

在類似 Microsoft Dynamics 365 的多執行緒及多使用者系統上,通常會平行執行作業和資料變更。 當同一項資料上同時發生兩個或多個更新或刪除作業時,將會出現問題。 這種情況可能會造成資料遺失。 此 SDK 版本中提供的功能可讓您的應用程式偵測伺服器上的實體記錄,在應用程式擷取記錄時和其嘗試更新或刪除記錄時之間的這段期間是否已發生變更。

啟用離線同步處理的所有內建實體和所有自訂實體都支援開放式並行存取。 您可以透過擷取實體中繼資料 (透過 SDK) 或檢視中繼資料 (使用中繼資料瀏覽器),或檢查屬性 IsOptimisticConcurrencyEnabled 是否設為 true,判斷實體是否支援開放式並行存取。 對於自訂實體,此屬性預設為 true。若要檢視組織的實體中繼資料,請安裝瀏覽組織的中繼資料中敘述的中繼資料瀏覽器解決方案。 您也可以下載 SDK 後開啟其頂層資料夾內所附名為 EntityMetadata.xlsx 的 Excel 檔案,從中檢視未經自訂組織的中繼資料。

本主題內容

啟用開放式並行存取

更新或刪除記錄

處理例外

啟用開放式並行存取

在執行 UpdateRequest 時,透過將要求的 ConcurrencyBehavior 屬性設為 IfRowVersionMatches,可以啟用開放式並行存取檢查行為。 同樣地,如果是 DeleteRequest,您必須設定 ConcurrencyBehavior 屬性。

使用組織服務內容進行資料變更時,在 OrganizationServiceContext 物件上設定 ConcurrencyBehavior。 呼叫 SaveChanges 時,此值將傳遞至 OrganizationServiceContext 使用的所有 UpdateRequestDeleteRequest 訊息。

開放式並行存取行為只能透過 SDK 呼叫設定。 Web 應用程式的表單中目前沒有其設定。

更新或刪除記錄

在擷取實體記錄之後,存取 RowVersion 屬性取得該記錄的最新版。 在實體物件 (用作 UpdateRequestTarget),設定 RowVersion 屬性為已擷取的記錄的相同值,以及執行要求。 同樣地,在實體參照物件 (用作 DeleteRequestTarget),設定 RowVersion 屬性為已擷取的記錄的相同列版本值,以及執行要求。

若傳遞至 UpdateRequest 的實體包含相關實體,相同行為會套用至所有更新作業,使用隨每一個實體提供的列版本。

在平台收到要求時,會執行目前實體記錄列版本與要求中的列版本之比較。 如果列版本相符,而且 ConcurrencyBehavior 設為 IfRowVersionMatches,則作業成功。 否則,會傳回錯誤例外。

處理例外

使用開放式並行存取時,FaultException<OrganizationServiceFault> 中可傳回來自 Web 服務呼叫的數個錯誤條件。

  • ConcurrencyVersionMismatch (code=-2147088254)

    當提供列版本,且指示 IfVersionMatches 行為,如果現有記錄的版本不符合要求提供的列版本,會傳回錯誤。

  • ConcurrencyVersionNotProvided (code= -2147088253

    當指示 IfVersionMatches 行為,且未提供列版本的值時,會傳回錯誤。

  • OptimisticConcurrencyNotEnabled (code=-2147088243)

    當實體更新上指示 IfVersionMatches 行為時,且未啟用開放式並行存取,會傳回錯誤。

您可以檢查所傳回錯誤的 Code 屬性,決定錯誤是否與開放式並行存取相關。 先前顯示的錯誤條件代碼,取自 ErrorCodes.cs Helper 程式碼。

另請參閱

在伺服器上擴充 Microsoft Dynamics 365
範例:搭配更新及刪除作業使用開放式並行存取

Microsoft Dynamics 365

© 2017 Microsoft. 著作權所有,並保留一切權利。 著作權