背景: 今天项目组小伙伴问了一个问题,如果更新数据超过1万条的情况下,有什么好的方式来实现呢?我们都知道一个transaction只能做10000条DML数据操作,那客户的操作的数据就是超过10000条的情况下,我们就只能搬出来salesforce government limitation进行拒绝吗?这显然也是不友好的行为。

实现方案: 

1. 代码中调用batch,batch处理的数据量多,从而可以忽略这个问题。当然,这种缺点很明显:

  1)不是实时的操作,什么时候执行取决于系统的可用线程,什么执行不知道;

  2)如果batch数据中有报错情况下,我们应该如何处理呢?全部回滚?继续操作?可能不同的业务不同的场景,哪样都不太理想。所以batch这种方案不到万不得已,基本不要考虑。

2. 前端进行分批操作,既然每一个transaction有限制,我们就将数据进行分拆操作,比如每2000或者其他的数量作为一批操作,然后进行后台交互,这样我们可以实时的获取状态,一批数据处理完成以后,我们在进行另外一批。正好博客中貌似没有记录这种的需求,所以整理一篇,js能力有限,抛砖引玉,欢迎小伙伴多多的交流沟通。

TestObjectController.cls: 获取数据,以及更新数据两个简单方法

public with sharing class TestObjectController {
    @AuraEnabled(cacheable=true)
    public static List<Test_Object__c> getTestObjectList() {
        List<Test_Object__c> testObjectList = [SELECT Id,Name 
                from Test_Object__c
                ORDER BY CREATEDDATE limit 50000];
        return testObjectList;
    }

    @AuraEnabled
    public static Boolean updateTestObjectList(List<Id> testObjectIdList) {
        List<Test_Object__c> testObjectList = new List<Test_Object__c>();
        for(Id testObjectId : testObjectIdList) {
            Test_Object__c objItem = new Test_Object__c();
            objItem.Id = testObjectId;
            objItem.Active__c = true;
            testObjectList.add(objItem);
        }
        update testObjectList;
        return true;
    }
}
12-31 08:37