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
相关产品推荐
相关产品推荐

