【Dynamics CRM】【C#】【7.1新機能】ExecuteTransactionRequestの活用
Dynamics CRM 7.1のSDK関係新機能の目玉(と思ってる)、[ExecuteTransactionRequest]をやってみました。
Dynamics CRMのSDKを利用したアプリケーションでは、基本的にトランザクションのサポートが無く、ロールバックを考慮することが大変面倒でした。
(Pluginはシステムのトランザクション内に処理を組み込めるので、ロールバックが望めますが、、、)
それが、今回のアップデートで追加されたExecuteTransactionRequestクラスを使うことによりトランザクションがサポートされ、一つでもRequest処理に失敗した場合は、ロールバックが実施されます。
ExecuteTransactionRequest
ExecuteTransactionRequestの基本的な使い方は、ExecuteMultipleRequestほとんど同じです。
過去の記事でExecuteMultipleRequestの使い方も示していますので、参考になればと思います。
違うところいえば、ExecuteMultipleRequestのパラメータにSettingsを入れないことくらい。
■MSDN
一応MSDNに記事が載っていますが、コード例が[ExecuteMultipleRequest]を使ったものという雑さ……。下に参考URLがありますので、そちらを参照したほうがいいと思います。
ExecuteTransactionRequest Class (Microsoft.Xrm.Sdk.Messages)
ExecuteTransactionRequestの制約
ExecuteTransactionRequestは一見大変便利そうな感じですが、いろいろな制約を持っています。
基本的には、ExecuteMultipleRequestと同じですが下記にピックアップしておきます。
・最大許容バッチサイズは1000件まで。1000件を超えるようであれば、Requestを分けないといけません。
・バッチリクエストは2件まで。同時に2件以上処理を行おうとすると、サーバーがエラーを返すみたいです。
・DBトランザクションがコミットに時間がかかる。ほかの処理を阻害する要因にもなるため、慎重に使ってくださいとのこと。
コード
では、実際に使ってみたいと思います。環境はもちろん最新版です。
・.NET Frameworks 4.5.2
今回はContactエンティティレコードを10件作成するプログラムとしました。
一部コメントアウトしている部分が文字数制限の例外発生用となっており、トランザクションが本当に実行されているかどうかの確認用です。
using System; using Microsoft.Xrm.Client; using Microsoft.Xrm.Client.Services; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; namespace MyProject.TransactionRequest { class Program { static void Main(string[] args) { var connection = CrmConnection.Parse("Url=https://****.crm7.dynamics.com; Username=****@****.onmicrosoft.com; Password=****;"); var service = new OrganizationService(connection); var transactionRequest = new ExecuteTransactionRequest() { Requests = new OrganizationRequestCollection() }; for (int i = 0; i < 10; i++) { var contact = new Entity("contact"); contact["firstname"] = "Create : " + i; contact["lastname"] = "Tracsaction"; var createRequest = new CreateRequest() { Target = contact }; transactionRequest.Requests.Add(createRequest); }; /* 例外発生用 var contactError = new Entity("contact"); contactError["firstname"] = "Create Error : "; contactError["lastname"] = "122345678901223456789012234567890122345678901223456789012234567890"; var createRequestError = new CreateRequest() { Target = contactError }; transactionRequest.Requests.Add(createRequestError); */ try { service.Execute(transactionRequest); } catch (Exception ex) { Console.WriteLine("エラー : " + ex); Console.ReadKey(); } } } }
参考URL
下記サイトが一番詳しく説明しているかなぁと思いました。