ガバナ制限を確認する時、Limitsクラスを使用してガバナ制限の制限値と現在の消費数を確認ができます。
※LimitではなくLimitsなので間違えないように!
今回はgetDMLStatementsを調べてみる
ガバナ制限については、色々な制限がありますが、今回はDMLの実行数について、調べて見ます。
まずは、手始めに以下のコードから、
System.debug(String.valueOf(Limits.getDMLStatements())+'/'+String.valueOf(Limits.getLimitDMLStatements()));
出力結果は、
0/150
となる。
DML実行回数の上限150に対して、1回もDML操作をやっていないので、当然getDMLStatementsメソッドは0を返す。
DB操作を色々やってみて消費数を調べる
今後、色々なDML操作をApexに盛り込んでみました。
// 1 スタート時 System.debug(String.valueOf(Limits.getDMLStatements())+'/'+String.valueOf(Limits.getLimitDMLStatements())); SavePoint sp = Database.setSavepoint(); // 2 セーブポイント設置後 System.debug(String.valueOf(Limits.getDMLStatements())+'/'+String.valueOf(Limits.getLimitDMLStatements())); Account acc = new Account(Name = 'Hoge'); insert acc; // 3 insert後 System.debug(String.valueOf(Limits.getDMLStatements())+'/'+String.valueOf(Limits.getLimitDMLStatements())); acc = [Select Id, YearStarted From Account Where id = :acc.Id]; // 4 select後 System.debug(String.valueOf(Limits.getDMLStatements())+'/'+String.valueOf(Limits.getLimitDMLStatements())); // あえて文字列オーバーになるように設定 acc.YearStarted = '201801'; Database.update(acc, false); // 5 update後(実際には更新されない) System.debug(String.valueOf(Limits.getDMLStatements())+'/'+String.valueOf(Limits.getLimitDMLStatements())); delete acc; // 6 delete後 System.debug(String.valueOf(Limits.getDMLStatements())+'/'+String.valueOf(Limits.getLimitDMLStatements())); Database.rollback(sp); // 7 ロールバック後 System.debug(String.valueOf(Limits.getDMLStatements())+'/'+String.valueOf(Limits.getLimitDMLStatements()));
色々なDML操作を詰め込んで実行したところ、デバッグログはこうなりました。
※カッコ内は実際にはログに出していないけど、説明用に追記しました。
0/150 (スタート時)
1/150 (セーブポイント設置)
2/150 (insert後)
2/150 (select後)
3/150 (update後 実際には1件も更新されない)
4/150 (delete後)
5/150 (ロールバック後)
1/150 (セーブポイント設置)
2/150 (insert後)
2/150 (select後)
3/150 (update後 実際には1件も更新されない)
4/150 (delete後)
5/150 (ロールバック後)
なるほど、ここで注意すべきはSelect。
DMLって言葉の意味で調べると、
データベースにおいてデータの検索・新規登録・更新・削除を行う
ってあるんだけど、ApexからのDML操作には検索はDML操作数にカウントされないみたいです。
間違えやすいから注意しましょう。
まとめ
- Limits.getDMLStatements()でApexトランザクション内のDML操作数をカウントできる
- SelectはDML操作数にカウントされない
- セーブポイント、ロールバックはDML操作数にカウントされる
コメント