经常会遇到一些SF异常的报错邮件,下面做一些常见的总结吧:
- UNABLE_TO_LOCK_ROW 产生于死锁,一般是两种场景造成:两个transactions同时对一条记录进行更新;或者一个transactions超时。
- STRING_TOO_LONG 前台没有做字段长度限制,导致后台提交报错。
- LIMIT_EXCEEDED
(一)Too many SOQL queries: 101.一个transaction只能一次执行100条SOQL,检查是否SOQL或DML写在循环中;如果需要更改上下文,可以使用@future注释来异步运行代码。
需要注意的是,一个trigger里面执行的属于一个transaction。
(二)Too many DML rows: 10001 一个transaction只能一次更新10,000条记录,尝试用batch代替apex操作。
(三)Apex CPU time limit exceeded SF服务器cpu同步执行最大延时10s,异步60s。尝试多使用基于query的map结构;尝试是否可以异步执行一些代码(@future);尝试合并SOQL;尝试减少数据的循坏遍历。
下面顺便总结一下常见的Apex Governor Limits(在一个transaction内):
1.一次只能同步执行100条SOQL;异步执行200条SOQL;
2.一次SOQL只能查询50,000条数据;一次 Database.getQueryLocator只能查询10,000条数据;
3.一条SOSL一次只能查询2000条数据;
4.一次只能执行100条callouts (HTTP requests or Web services calls)
5.一次只能更新10,000条记录
详细参考:https://developer.salesforce.com/docs/atlas.en-us.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_apexgov.htm
- CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY 没有权限创建,更新某条记录(检查字段,对象权限)。
- INVALID_FIELD_FOR_INSERT_UPDATE 常见于给字段赋非法值,给只读字段赋值,对父对象记录DML操作。详见:https://help.salesforce.com/articleView?id=000073334&type=1
- INVALID_OR_NULL_FOR_RESTRICTED_PICKLIST 给picklist类型字段赋空值或限制以外值。
- FIELD_FILTER_VALIDATION_EXCEPTION 是否更新操作违背了字段的lookp filter规则。