APEX 中可能出现死锁的场景有很多,下面给出一些常见的示例以及如何解决:
// 查询记录 Account acc = [SELECT Name FROM Account WHERE Id=:recordId FOR UPDATE];
// 更新记录 acc.Name = 'New Name'; update acc;
为了避免这种情况,可以使用 FOR UPDATE SKIP LOCKED,它会跳转那些已经被锁定的记录。例如:
// 查询记录
List
// 更新记录 if (accs.size() > 0) { Account acc = accs[0]; acc.Name = 'New Name'; update acc; }
public class TriggerHandler { // 标记是否正在处理该类型的触发器 private static Boolean isProcessingBeforeUpdate = false;
public static void beforeUpdate(List newAccounts, List oldAccounts) {
// 如果已经在处理 beforeUpdate 触发器,则跳过
if (isProcessingBeforeUpdate) {
return;
}
isProcessingBeforeUpdate = true;
try {
// 执行代码
} catch (Exception ex) {
// 处理异常
} finally {
isProcessingBeforeUpdate = false;
}
}
}