Note
コミュニティの関心グループが Yammer から Microsoft Viva Engage に移行されました。 Viva Engage コミュニティに参加し、最新のディスカッションに参加するには、「 Finance and Operations Viva Engage Community へのアクセスを要求する 」フォームに入力し、参加するコミュニティを選択します。
より一貫した可用性とパフォーマンスのために、二重書き込みを使用して財務と運用アプリと Microsoft Dataverse にデータを書き込む際に制限が適用されます。 このプラットフォームでは、これらの制限を適用して、デュアル書き込みトランザクションを制御します。 シームレスな書き込みを実現し、障害を最小限に抑えるのに役立ちます。
Finance and Operations アプリと Dataverse には、多数のレコードと複雑なマルチテーブル トランザクションにまたがる多くのプロセスがあります。 各環境には、トランザクションの数、トランザクションごとのレコード数、およびトランザクション時間 (つまり、トランザクションの処理に必要な時間) に制限があります。 これらの制限および二重書き込みの Live 同期機能に対する影響を理解することは重要です。
法人
ライブ同期では、トランザクションごとに最大 250 の法人をサポートします。 この制限は、初期同期とは異なり、データ量と関連する操作が大きいため、40 個の法人のみがサポートされます。
トランザクションのパターン
1 つのプロセスで、2 つの異なるトランザクション パターンでデータを書き込むことができます。
- 単一トランザクション – プロセスが書き込むすべてのデータは、1 つのトランザクションの一部です。
- 複数のトランザクション – プロセスは、書き込むすべてのデータを複数のトランザクションに分割します。
1 つのトランザクション
1 つのトランザクションでは、プロセスが書き込むすべてのデータが 1 つのトランザクションの一部になります。 エラーが発生した場合、トランザクション全体がロールバックされます。
一般的な例として、1 つのトランザクションで複数の請求書を作成するプロセスがあります。 この場合、プロセスは 1 つのトランザクション内のすべての請求書をコミットするか、エラーが発生した場合にすべての請求書をロールバックします。 次のコード例では、1 つのトランザクションで複数の請求書を作成します。
ttsbegin;// Transaction start
Invoice1.create();
Invoice2.create();
Invoice3.create();
// Additional invoices.
InvoiceN.create();
ttscommit;// Transaction end
ttsbegin;// Transaction start
while (/* loop condition */)
{
InvoiceN.create();
}
ttscommit;// Transaction end
複数のトランザクション
複数のトランザクションでは、プロセスによって書き込まれるすべてのデータが複数のトランザクションに分割されます。 エラーが発生した場合、複数のトランザクションのグループ全体はロールバックされません。 代わりに、各トランザクションは個別にロールバックされるかまたは確定されます。 失敗したトランザクションはすべてロールバックされます。 失敗しなかったトランザクションはすべて確定されます。
一般的な例として、複数の請求書を作成するプロセスがあります。 各請求書は個別のトランザクションで作成され、エラーが発生した場合は、特定のトランザクションに含まれている請求書だけがロールバックされます。 残りの請求書は正常に確定されます。 次のコード例では、トランザクションごとに 1 つずつ、複数の請求書を作成します。
ttsbegin; // Transaction start
Invoice1.create();
ttscommit;// Transaction end
ttsbegin;// Transaction start
Invoice2.create();
ttscommit;// Transaction end
ttsbegin;// Transaction start
Invoice3.create();
ttscommit;// Transaction end
// Additional transactions.
ttsbegin;// Transaction start
InvoiceN.create();
ttscommit;// Transaction end
while (/* loop condition */)
{
ttsbegin;// Transaction start
InvoiceN.create();
ttscommit;// Transaction end
}
トランザクションの制限時間
デュアル書き込みを使用して財務および運用アプリまたは Dataverse にレコードを書き込む場合、各トランザクションは特定の時間内に完了する必要があります。 トランザクションの時間制限前にトランザクションが完了しない場合、デュアル書き込みでは、財務および運用アプリと Dataverse にレコードがコミットされません。 この場合、デュアル書き込みでは、財務環境と運用環境と Dataverse 環境の両方で、トランザクション内のレコードがロールバックされます。
たとえば、デュアルライトを使用して財務アプリと運用アプリから Dataverse にコントラクトの更新を同期すると、財務アプリと運用アプリのビジネス ロジックが完了し、Dataverse プロセスが開始されたときにタイマーが開始されます。 トランザクションが確定される時にタイマーは終了します。 Dataverse で費やされた時間全体には、書き込み必要な時間、標準およびカスタムのプラグインを処理するのに必要な時間も含まれます。 トランザクションが制限時間を超えた場合、Dataverse にレコードは確定されません。
同じ原則は、デュアル書き込みを使用して、Dataverse から財務および運用アプリまで、他の方向にデータを書き込む場合にも当てはまります。
二重書き込みのライブ同期の制限
次の表は、財務と運用アプリと Dataverse 間でデータを書き込む時に適用される二重書き込みのライブ同期の制限を示しています。 これらの制限はデータ フローの方向に対して固有です: 財務と運用アプリから Dataverse へ、または Dataverse から財務と運用アプリへ。
財務と運用アプリから Dataverse へ
財務アプリと運用アプリから Dataverse にデータを書き込む場合は、次の制限が適用されます。
| 測定 | 制限 |
|---|---|
| トランザクションの数 | サービス保護 API の制限は、テナントごとに 1 日に実行できるトランザクションの合計数を制御します。 これらの制限は、クライアント アプリケーションがサーバー リソースに対して特別な要求を行うタイミングを検出するように設計されています。 詳細については、サービス保護 API の制限を参照してください。 |
| 1 つのトランザクションあたりのレコード数 | 1,000 レコード 1 つのトランザクションのレコードが 1,000 件を超える場合、そのトランザクションを複数のトランザクションに分割することを検討してください。 詳細については、この記事の 1,000 レコードを超えるトランザクション を参照してください。 |
| トランザクションの制限時間 | 2分 レコード数に関係なく、すべてのトランザクションのタイムアウト ウィンドウは2分です。 2分以上実行されたトランザクションは、ソース側およびターゲット側で中止されます。 タイムアウトの可能性を減らすには、Dataverse プラグインで最適化オプションを検討してください。 |
財務と運用アプリから Dataverse へ
Dataverse から財務および運用アプリにデータを書き込む場合は、次の制限が適用されます。
| 測定 | 制限 |
|---|---|
| トランザクションの数 | 優先度ベースの調整制限は、トランザクションの数に影響する可能性があります。 これらの制限は、リソースの過剰使用を防ぎ、システムの応答性を維持するのに役立ちます。 詳細については、優先順位に基づく調整を参照してください。 |
| 1 つのトランザクションあたりのレコード数 | Dataverse のペイロード サイズ制限では、転送できるレコードの数が制限されます。 トランザクションごとの制限は 116.85 メガバイト (MB) です。 詳細については、エラー: コンテキストをサンドボックスに送信するときにメッセージ サイズが超過しましたを参照してください。 エンティティの複雑さ、使用する列の種類、マップされたフィールドなど、複数の要因がこの制限の使用方法に影響します。 そのため、制限を単純な数のレコードとして表現することはできません。 この制限を超えると、Dataverse はトランザクション ( メッセージと呼ばれます) を拒否し、次のエラー コードが使用されます。 エラー コード: -2147220970 エラー メッセージ: コンテキストをサンドボックスに送信するときにメッセージ サイズが超過しました。 メッセージ サイズ: ### MB 1 つのトランザクションのレコード サイズが 116.65 MB を超える場合、トランザクションを複数のトランザクションに分割することを検討してください。 詳細については、この記事の 1,000 レコードを超えるトランザクション を参照してください。 |
| トランザクションのタイムアウト | 2 分 |
1,000 レコードを超えるトランザクション
トランザクションのレコードが 1,000 件を超えるシナリオは、一般的です。 これらのシナリオでは、1 つのトランザクションを複数のトランザクションに分割します。 次のコード例で、レコード ID に基づいて複数のトランザクションを作成する方法を示します。
ttsbegin;// Transaction start.
Invoice1.create();
Invoice2.create();
// Additional invoices.
Invoice1000.create();
ttscommit;// Transaction end.
ttsbegin;// Transaction start.
Invoice1001.create();
Invoice1002.create();
// Additional invoices.
Invoice2000.create();
ttscommit;// Transaction end.
ttsbegin;// Transaction start.
Invoice2001.create();
Invoice2002.create();
// Additional invoices.
Invoice3000.create();
ttscommit;// Transaction end.
// Additional transactions.
ttsbegin;// Transaction start.
Invoice(N)1.create();
Invoice(N)2.create();
// Additional invoices.
Invoice(N+1)000.create();
ttscommit;// Transaction end.
i = 1;
committPending = false;
while (/* loop condition */)
{
if (i==1)
{
ttsbegin;// Transaction start.
committPending = true;
}
InvoiceN.create();
if (i == 1000)
{
ttscommit;// Transaction end.
committPending = false;
i = 0;
}
i++;
}
if (committPending == true)
{
ttscommit; // Transaction end.
}