今回は、Apexの「Too many DML statements: 151」の原因と回避策についてです。
1トランザクション内でのDML処理の回数がガバナ制限を超過すると発生するエラーです。
エラー原因
エラーの原因は、1トランザクションで 発行される DML ステートメントの合計数が150を超えたからです。
DML ステートメントとは、以下のようにDBのデータを操作するような操作言語を指します。
- insert
- update
- delete
- upsert
- undelete
- merge
Salesforceのガバナ制限では、1トランザクションで発行される DML ステートメントの合計数の上限が150と定められています。(非同期処理も150)
つまり150回を超えるDMLステートメントを発行するとエラーとなります。
例えば、以下のコードを匿名実行コンソールで実行し、 DML ステートメントの合計が151以上になるとエラーがでます。
for(integer i=0; i<151;i++){
Account acc = new Account();
acc.Name='test'+i;
insert acc;
}
エラー回避策
エラー回避策としては、複数レコードをまとめて処理することです。
1レコードずつinsertやupdateをするとすぐにガバナ制限にかかってしまいます。
以下のコードのように処理対象レコードをListに詰めて一括で処理するようにしましょう。
List<Account> accList = new List<Account>();
for(integer i=0; i<151;i++){
Account acc = new Account();
acc.Name='test'+i;
accList.add(acc);
}
insert accList;
おわりに
基本的に1レコードのみを想定したDML処理を書かないようにしておけば、「Too many DML statements: 151」エラーは回避できます。
上の例ではinsertの処理となっていますが、updateでもdeleteでもすることは同じです。
Listに詰めて処理する、と覚えておきましょう!
今回は以上になります。

コメント