You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Salesforce插入Case后创建20000条CaseComment的DML限制问题

解决Apex批处理创建20000条CaseComment的DML限制问题

你的问题核心是批处理的execute方法本身属于单个事务,当前代码在一次execute中执行了150次DML插入,每次66条,总条数接近单事务10000条的DML限制,导致无法创建满20000条。此外,你的批处理start方法仅返回1条Case记录,所以execute只会触发一次,没利用上批处理多事务拆分的特性。

方案一:单事务内拆分两次DML插入(最简实现)

单事务允许最多10000条DML操作,直接分两次插入,每次10000条即可满足需求:

public class CreateCaseCommentsBatch implements Database.Batchable<SObject> {
    private Id caseId;
    public CreateCaseCommentsBatch(Id caseId) {
        this.caseId = caseId;
    }
   
    public Database.QueryLocator start(Database.BatchableContext context) {
        return Database.getQueryLocator([SELECT Id FROM Case WHERE Id = :caseId]);
    }

    public void execute(Database.BatchableContext context, List<Case> scope) {
        List<CaseComment> caseCommentsToInsert = new List<CaseComment>();
        // 第一次插入10000条
        for (Integer i = 1; i <= 10000; i++) {
            CaseComment cc = new CaseComment(
                ParentId = caseId,
                CommentBody = 'Dummy Comment ' + i + ' - Of Case: ' + caseId
            );
            caseCommentsToInsert.add(cc);
        }
        insert caseCommentsToInsert;
        caseCommentsToInsert.clear();
        
        // 第二次插入10000条
        for (Integer i = 10001; i <= 20000; i++) {
            CaseComment cc = new CaseComment(
                ParentId = caseId,
                CommentBody = 'Dummy Comment ' + i + ' - Of Case: ' + caseId
            );
            caseCommentsToInsert.add(cc);
        }
        insert caseCommentsToInsert;
    }

    public void finish(Database.BatchableContext context) {
    }
}

方案二:利用批处理多事务特性(规范实现)

修改批处理类,通过Iterable指定批次数量,让批处理自动拆分多个事务执行,每个事务处理10000条:

public class CreateCaseCommentsBatch implements Database.Batchable<Integer> {
    private Id caseId;
    private final Integer TOTAL_COMMENTS = 20000;
    private final Integer BATCH_SIZE = 10000;

    public CreateCaseCommentsBatch(Id caseId) {
        this.caseId = caseId;
    }

    public Iterable<Integer> start(Database.BatchableContext context) {
        List<Integer> batches = new List<Integer>();
        // 计算需要的批次数量
        Integer batchCount = (TOTAL_COMMENTS + BATCH_SIZE - 1) / BATCH_SIZE;
        for (Integer i = 0; i < batchCount; i++) {
            batches.add(i);
        }
        return batches;
    }

    public void execute(Database.BatchableContext context, List<Integer> scope) {
        List<CaseComment> caseCommentsToInsert = new List<CaseComment>();
        Integer batchIndex = scope[0];
        Integer startNum = batchIndex * BATCH_SIZE + 1;
        Integer endNum = Math.min((batchIndex + 1) * BATCH_SIZE, TOTAL_COMMENTS);
        
        for (Integer i = startNum; i <= endNum; i++) {
            CaseComment cc = new CaseComment(
                ParentId = caseId,
                CommentBody = 'Dummy Comment ' + i + ' - Of Case: ' + caseId
            );
            caseCommentsToInsert.add(cc);
        }
        insert caseCommentsToInsert;
    }

    public void finish(Database.BatchableContext context) {
        // 可选:添加完成后的通知或日志逻辑
    }
}

触发器无需修改

你当前的触发器逻辑符合需求,仅在单个Case插入时启动批处理,无需调整。

内容的提问来源于stack exchange,提问作者Dan Yanuka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:28:34