背景: 今天项目组小伙伴问了一个问题,如果更新数据超过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