MENU
Abo
某SIer勤務。
新卒文系からエンジニア就職。
日々の学びをつらつらと書いています。
保有資格:
Salesforce認定アドミニストレーター  
Salesforce認定Platformデベロッパー
Salesforce認定上級Platformデベロッパー
カテゴリー
アーカイブ

【Apex】「Too many DML statements: 151」エラーの原因と回避策

今回は、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ステートメントを発行するとエラーとなります。

ガバナ制限とは、処理実行時にSalesforceにあるDBやメモリなどのリソースが大きく占領されることを防ぎ、他のユーザの使用に影響を与えないための制限のことです。(参考:Apexガバナ制限

例えば、以下のコードを匿名実行コンソールで実行し、 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に詰めて処理する、と覚えておきましょう!

今回は以上になります。

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

この記事を書いた人

某SIer勤務。
新卒文系からエンジニア就職。
日々の学びをつらつらと書いています。
保有資格:Salesforce認定アドミニストレーター
     Salesforce認定Platformデベロッパー
     Salesforce認定上級Platformデベロッパー

コメント

コメントする

CAPTCHA


目次