我想使用apex在salesforce中实现同步。
我的要求是,我必须从未来的方法更新字段。
我在数据库中有一个名为Counter_ c的字段,我正在调用一个方法,该方法将调用3 future方法。那些未来的方法将尝试将计数器 _c的值递增1.但是字段没有得到更新。
这是我的代码:
public void generateReports(){
ReportHistory__c repHst = new ReportHistory__c();
repHst.Counter__c = 0;
insert repHst;
generateReport1(repHst.Id);
generateReport2(repHst.Id);
generateReport3(repHst.Id);
}
@future
public static void generateReport1(Id id) {
List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
if(!lstRep.isEmpty()) {
++lstRep[0].Counter__c;
}
update lstRep;
}
@future
public static void generateReport2(Id id) {
List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
if(!lstRep.isEmpty()) {
++lstRep[0].Counter__c;
}
update lstRep;
}
@future
public static void generateReport3(Id id) {
List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
if(!lstRep.isEmpty()) {
++lstRep[0].Counter__c;
}
update lstRep;
}
执行上面的代码后,我想Counter _c应该是3.但它仍然是0或有时是1。
请帮助我,如果有任何办法让我可以控制未来的通话,以便将来每次通话都应该将Counter__c的值更新为1。
谢谢, 的Vivek
答案 0 :(得分:1)
从您的示例代码中可以看出lstRep.isEmpty()
检查缺少否定。
E.g。在if条件中添加!
。
@future
public static void generateReport1(Id id) {
List<ReportHistory__c> lstRep = [select Counter__c rom ReportHistory__c where Id = :id];
if(!lstRep.isEmpty()) {
lstRep[0].Counter__c++;
}
update lstRep;
}
您的未来方法也可能会从队列中取出并由不同的应用程序服务器并行处理。如果是这种情况,则会出现并发问题。阅读Asynchronous Processing in Force.com。您可以尝试将FOR UPDATE
关键字添加到SOQL查询中,但这可能会导致您将来的某些方法超时。