在 DML 语句执行的时候可以设置选项。这些选项用 DML.Options 类来表示。
完整的介绍在官方文档中。
在建立一个 DML.Options 实例之后,可以使用 setOptions() 函数来使用。
比如:
Database.DMLOptions dmo = new Database.DMLOptions();
dmo.allowFieldTruncation = true;
Account a = new Account();
// 设置 Account 的各种属性值
// ...
// 将 DML 选项设置到 Account 对象中,然后插入。这些选项就会被应用了
a.setOptions(dmo);
insert a;
可用的属性主要有:
SavePoint 对象可以将 DML 语句的执行结果回滚到之前的状态,多用于 DML 出错的情况下恢复数据。基本用法如下:
Savepoint sp1 = Database.setSavepoint();
Account a = new Account();
// 设置 Account 对象的属性
// ...
insert a;
Savepoint sp2 = Database.setSavepoint();
// 更改 Account 对象的属性
// ...
update a
// 回滚数据到 sp1 的状态
Database.rollback(sp1);
需要注意的是:
在 SOQL 语句中更新某条记录时,我们可以使用 FOR UPDATE 关键字锁住当前记录,使得它不会被其他的线程影响,从而导致数据出错。
比如:
Account [] accts = [SELECT Id FROM Account LIMIT 2 FOR UPDATE]; // 这两条 Account 数据会被锁住,直至当前 Apex 的代码段执行完毕
注意,ORDER BY 语句不能和 FOR UPDATE 一起使用。
当一条记录被锁住之后,其他线程如果也想对它进行更新,则要等待它被解锁。如果等待超过10秒,就会出错。
原文:https://www.cnblogs.com/chengcheng0148/p/dml_advanced_tips.html