Apex 中 DML 进阶知识小结

2019-07-19  本文已影响0人  程程哥

DML 选项

在 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 对象和数据回滚

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秒,就会出错。

上一篇 下一篇

猜你喜欢

热点阅读