【Salesforce 認定Platformデベロッパー】試験対策:第4問

問題

現在取引先が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回の取引先を効率的かつ安全にデータベースに挿入できます。

次の問題へ

前の問題へ

1問目から復習する

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

雇われのシステムエンジニアです。
普段は車載ECUのセキュリティー分野に従事しております。

コメント

コメントする

目次