Locking Records

DEX455 - Apex 中的数据操作:sObject 与 DML 完全指南

📄 第 176 页 🎬 视频课程

课程章节介绍

同学们,我们来看这页关于,记录锁定,的内容。这部分在 Apex 开发里非常重要,特别是当多个用户或后台进程同时想修改同一条记录的时候,很容易产生数据冲突。Salesforce 提供了一种锁定机制,来保证数据的一致性。 简单来说,当一条 sObject 记录被锁定以后,其他任何客户端或者用户,不管是通过代码还是直接在 Salesforce 界面上操作,都无法再更新这条记录了。只有锁定它的那个客户端,可以安安心心地执行自己的逻辑,做完更新,并且能确保在这个过程中,这条记录不会被别人偷偷改掉。这就保证了操作的原子性和数据安全。 那怎么才能在 Apex 里锁住记录呢?方法很简单:你在写内联 SOQL 查询的时候,在语句的最后加上一个关键字就行了。这里幻灯片上可能有个小笔误,大家注意一下,正确的写法是 ,FOR UPDATE,,不是 FOR GROUP。也就是说,你先写好 `SELECT ... FROM ... WHERE ...`,然后紧接着写上 `FOR UPDATE`,这样查出来的记录就被你锁住了。 不过用的时候有个限制要记住:,你不能把 ORDER BY 和 FOR UPDATE 一起用,。如果你需要对查询结果排序,可以先把数据查出来放到列表里,再用 Apex 的排序方法处理,没必要在锁记录的同时非得在查询里排序。 另外,Salesforce 的运行时引擎本身也内置了一些防止死锁的措施,它会在锁定子记录之前,先把相关的父记录锁住,并且会按照记录 ID 的顺序来锁定。这样能大大降低因为两个进程互相等待对方释放锁而卡死的概率。 虽然平台已经帮我们做了这些预防,但我们在设计逻辑的时候还是得小心,仍然要遵循标准的死锁避免技术。比如,尽量保持事务简短,按照固定的顺序去访问和锁定记录,减少同时锁住多张表的情况。这样你的代码才会更健壮,不容易在生产环境里出问题。 好,这就是这页 Slide 的核心内容。理解记录锁定,对写出高并发、高可靠性的 Apex 代码非常有帮助。

关键词

Apex Salesforce Developer Guide