我在刪除觸發器之前運行Apex作業,並注意到通過Salesforce界面刪除單個Campaign需要大約34秒,並且刪除了Campaign時Apex作業已完成運行。當我使用VisualForce頁面在相同數量的記錄(15,000)上運行相同的Apex作業時,Apex作業排隊並在VisualForce頁面完成後運行。頂點作業未在觸發器中異步運行
在這個屏幕截圖中,第一份工作是使用VisualForce第二和第三排隊使用觸發器排隊:
正如你可以看到雖然相同數量的記錄(15,000)被處理在使用觸發器批次排隊時創建相同的Apex作業且提交和完成日期完全不同。
的Apex作業在排隊觸發:
trigger DeleteChilds on Campaign (before delete) {
public static final Integer MAX_DELETED = 500;
Set<ID> ids = new Set<Id>();
List<Parent__c> objs = new List<Parent__c>();
for(Campaign c : Trigger.old)
ids.add(c.Id);
objs = [SELECT Id FROM Parent__c WHERE Campaign__c IN :ids];
ids = new Set<Id>();
for(Parent__c s : objs)
ids.add(s.Id);
Integer childCount = [SELECT count() FROM Childs__c WHERE Parent__c IN :ids];
if(childCount < MAX_DELETED){
List<Childs__c> childs = [SELECT Id FROM Childs__c WHERE Parent__c IN :ids];
delete childs;
} else {
String deleteQuery = 'SELECT Id FROM Childs__c WHERE ';
for(ID id : ids){
deleteQuery += String.format(' Parent__c = \'\'{0}\'\' OR', new String[] {id});
}
if(deleteQuery.endsWith('OR')){
deleteQuery = deleteQuery.substring(0, deleteQuery.length() - 2);
}
BatchDeleteChilds batch = new BatchDeleteChilds();
batch.deleteQuery = deleteQuery;
ID batchId = Database.executeBatch(batch);
}
delete objs;
}
這是頂點工作:
global class BatchDeleteChilds implements Database.Batchable<sObject> {
public String deleteQuery;
global Database.QueryLocator start(Database.BatchableContext context){
return Database.getQueryLocator(deleteQuery);
}
global void execute(Database.BatchableContext context, List<sObject> records){
delete records;
DataBase.emptyRecycleBin(records);
}
global void finish(Database.BatchableContext context){
}
}
有其他人遇到這樣的事情?
謝謝,
有趣的問題。你可以運行調試登錄並共享結果嗎?可以幫助確定可能沒有報告爲批處理上下文錯誤的問題。另外,最好在刪除後的上下文中運行它嗎?以防萬一該活動無法刪除。那麼你不會失去孩子的記錄。 –
將觸發器更改爲在父對象的Campaign__c字段中的刪除結果爲空之後運行,因爲Campaign已被刪除。這會導致沒有刪除,因爲[SELECT Id FROM Parent__c WHERE Campaign__c IN:ids]不會返回任何結果。 – mob1lejunkie