問題
現在取引先が100個ある場合に、開発者コンソールを使用して次のコードを実行します。
Account myAccount = new Account(Name = 'MyAccount');
insert myAccount;
For(Integer x = 0; x < 250; x++) {
Account newAccount = new Account(Name = 'MyAccount' + x);
try {
Insert newAccount;
} catch (Exception ex) {
System.debug(ex);
}
insert new Account(Name = 'myAccount');
}
このコードの実行後、組織にはいくつの取引先がありますか。
- 101
- 100
- 102
- 252
正解
- 101
- 100
- 102
- 252
解説
コード実行後の組織には100の取引先が存在します。
以下がその理由です。
- 最初の
Insert myAccount;
で取引先MyAccount
がデータベースに挿入される試みが行われます。 - 次に、250回のループが始まり、各反復ごとに2回のDML操作(Insert操作)が行われます。
- しかし、SalesforceのApexにはDML操作のガバナ制限が存在し、単一のトランザクション内でのDML操作の最大回数は150回です。
- ループの途中、このDML操作の制限を超えると、
System.LimitException: Too many DML statements: 151
という例外が発生します。 - Salesforceのトランザクション管理の特性として、トランザクション内で一つの操作が失敗すると、そのトランザクション全体がロールバックされます。これはデータの整合性を保つためのものです。したがって、このコード内で発生する例外により、すでに成功していた
Insert myAccount;
による挿入もロールバックされます。
結論として、このコードを実行した後、元々の100個の取引先の数は変わらず、新たに追加される取引先はありません。
Account myAccount = new Account(Name = 'MyAccount');
insert myAccount;
For(Integer x = 0; x < 250; x++) {
Account newAccount = new Account(Name = 'MyAccount' + x);
try {
Insert newAccount;
} catch (Exception ex) {
System.debug(ex);
}
insert new Account(Name = 'myAccount');
}
ガバナ制限との遭遇
SalesforceのApexでは、DML操作の上限に達すると例外が発生します。具体的には、一つのトランザクション内でのDML操作の最大回数は150回です。当初のコードでは、ループ内で各取引先ごとに個別にinsert
操作を行っていたため、ループが150回を超えるとDMLの制限を超えてしまい、System.LimitException
が発生しました。そして、Salesforceのトランザクション処理特性上、1つの操作が失敗するとそのトランザクション全体がロールバックされるため、前の操作で挿入されたデータもすべてロールバックされました。
ガバナ制限を回避する改善策:一括挿入の利用
上記の問題を解決するための主な改善策は、DML操作の回数を最小限に抑えることです。具体的なアプローチとして、取引先を一括で挿入する方法を採用しました。これにより、250回の取引先を一つのDML操作でデータベースに挿入することができ、DMLの上限を超えることなくデータを追加できます。
List<Account>
型のリストを初期化し、これを使用して生成されるすべての取引先を格納します。- 250回のループ内で、各取引先を生成し、それを上記のリストに追加します。
- ループ終了後、リスト内のすべての取引先を一度のDML操作でデータベースに挿入します。
// 取引先のリストを初期化
List<Account> accountList = new List<Account>();
// 250回のループで取引先を生成してリストに追加
for(Integer x = 0; x < 250; x++) {
// 新しい取引先を生成
Account newAccount = new Account(Name = 'MyAccount' + x);
// 生成した取引先をリストに追加
accountList.add(newAccount);
}
// 取引先のリストを一括登録
try {
insert accountList;
} catch (Exception ex) {
System.debug(ex);
}
この方法により、250回の取引先を効率的かつ安全にデータベースに挿入できます。
次の問題へ
【Salesforce 認定Platformデベロッパー】試験対策:第5問
問題 トリガーの実行順序で、beforeトリガーが実行された後、およびafterトリガーが実行される前に、どのステップが発生しますか。正確な順序を答えなさい。 システム検…
前の問題へ
【Salesforce 認定Platformデベロッパー】試験対策:第3問
問題 非同期Apexを実行して、ガバナ制限と実行制限が緩和されるものはどれですか。3つ選びなさい。 ヒープの合計サイズ Salesforceサーバの最大CPU時間 Apexトランザク…
1問目から復習する
【Salesforce 認定Platformデベロッパー】試験対策:第1問
問題 デバッグログに書き込まれるときのxの値は何ですか。 Integer x = 0; do { x = 1; x++; } while (x < 1); System.debug(x); 0 1 2 3 正解 0 1 2 3 解説 デバッ…
コメント