オプティミスティック同時実行を使用してデータ損失の見込みを削減する
公開日: 2017年1月
対象: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online
Microsoft Dynamics 365 のようなマルチスレッド、マルチユーザー システムでは、操作とデータの変更がよく並行して実行されます。 同じデータの部分に対して 2 つ以上の更新または削除の操作が同時に行われると、問題が発生します。 この状態は、データの損失を引き起こす可能性があります。 この SDK リリースでは、ユーザーのアプリケーションがエンティティ レコードを取得した時点からそのレコードの更新または削除を試みるときまでに、サーバー上でそのレコードに変更があったかどうかをアプリケーションで検出する機能が提供されます。
オプティミスティック同時実行は、オフライン同期とすべてのユーザー定義エンティティが有効なすべての標準エンティティでサポートされています。 SDK 呼び出しを使用してエンティティのメタデータを取得することによって、またはメタデータ ブラウザーを使用してメタデータを表示することによってエンティティがオプティミスティック同時実行をサポートするかどうかを決定し、属性 IsOptimisticConcurrencyEnabled が true に設定されているかを確認できます。 ユーザー定義エンティティでは、このプロパティは true に既定で設定されます。組織のエンティティ メタデータを表示するには、「組織のメタデータの参照」で説明されているメタデータ ブラウザー ソリューションをインストールします。 カスタマイズされていない組織のメタデータを、EntityMetadata.xlsx という名前の Excel ファイルで見ることもできます。このファイルは、ダウンロードした SDK の最上位のフォルダーに含まれています。
このトピックの内容
オプティミスティック同時実行を有効化
レコードを更新または削除
例外処理
オプティミスティック同時実行を有効化
要求の ConcurrencyBehavior プロパティを IfRowVersionMatches に設定して UpdateRequest を実行するとき、オプティミスティック同時実行の確認動作を有効にできます。 同様に、DeleteRequest に対して、ConcurrencyBehavior プロパティを設定します。
組織サービス コンテキストを使用してデータに変更を加える場合、OrganizationServiceContext オブジェクトに対して ConcurrencyBehavior を設定します。 この値は、SaveChanges が呼び出されたときに、OrganizationServiceContext によって使用されるすべての UpdateRequest および DeleteRequest メッセージに渡されます。
オプティミスティック同時実行の動作は、SDK 呼び出しによってのみ設定できます。 現在、Web アプリケーションのフォームでは、OC の動作に対して何も設定されていません。
レコードを更新または削除
エンティティ レコードを取り出した後、RowVersion 属性にアクセスして、そのレコードの現在のバージョンを取得します。UpdateRequest で Target として使用するエンティティ オブジェクトで、RowVersion プロパティを、取得したレコードからの同じ値に設定して要求を実行します。 同様に、DeleteRequest で Target として使用するエンティティ参照オブジェクトで、RowVersion プロパティを、取得したレコードからの同じ行バージョン値に設定して要求を実行します。
UpdateRequest に渡されるエンティティに関連エンティティが含まれている場合、個別の各エンティティが提供する行バージョンを使用して、同じ動作がすべての更新操作に適用されます。
要求がプラットフォームで受け取られると、現在のエンティティ レコードの行バージョンと要求に含まれる行バージョンが比較されます。 行バージョンが一致し、ConcurrencyBehavior が IfRowVersionMatches に設定されると、操作が成功します。 それ以外の場合は、フォールト例外が返されます。
例外処理
オプティミスティック同時実行を使用するときに Web サービス呼び出しから FaultException<OrganizationServiceFault> で返すことができるいくつかのエラー状態があります。
ConcurrencyVersionMismatch (code=-2147088254)
行バージョンが提供されて、IfVersionMatches 動作が指示されているとき、既存のレコードのバージョンが要求で提供された行バージョンと一致しない場合、フォールトが返されます。
ConcurrencyVersionNotProvided (code= -2147088253
IfVersionMatches 動作が指示されていて、行バージョンの値が提供されていないとき、フォールトが返されます。
OptimisticConcurrencyNotEnabled (code=-2147088243)
IfVersionMatches 動作がエンティティの更新時に指示されていて、オプティミスティック同時実行が有効になっていない場合、フォールトが返されます。
返されたフォルトの コード プロパティをチェックして、フォルトがオプティミスティック同時実行に関連しているかどうか確認できます。 先に表示されたエラー状態を示すコードが、ErrorCodes.cs ヘルパー コードから取得されました。
関連項目
サーバー上の Microsoft Dynamics 365 の拡張
サンプル: オペレーションの更新プログラムおよび削除でオプティミスティック同時実行を使用する
Microsoft Dynamics 365
© 2017 Microsoft. All rights reserved. 著作権