0

在我们的生产组织中,我们有一个使用命令行数据加载器将销售数据上传到 Salesforce 的系统。此数据被加载到临时对象Temp中。我们创建了一个公式字段(它结合了三个字段)来形成一个唯一键。该对象的目的是减少用户手动创建密钥的工作量。

Temp上有一个插入后触发器, 它调用一个异步方法,该方法使用键将数据更新到另一个对象SalesDataSalesData上的插入/更新触发器检查各个字段并创建/更新另一个对象SalesRecords中的记录。插入/更新完成后,临时对象Temp中的所有记录都将 被删除。SalesRecords对象没有任何触发器,并且是另一个对象Sales的子对象。Sales对象有一些汇总字段,这些字段汇总了SalesRecords对象的字段。

最近,我们收到了一些更新的记录的以下错误。UNABLE_TO_LOCK_ROW,无法获得对该记录的独占访问权

请提供一些解决问题的指示

4

5 回答 5

3

这可能是由各种触发器执行中的 DML 操作冲突或某些递归触发器执行引起的。我会假设异步执行会导致同一记录上的多个后续更新,可能是在 SalesRecords 对象上。我建议尝试简化流程以避免太多相关的触发器执行。

于 2012-07-05T18:33:58.337 回答
2

我有点惊讶你能够让这个工作摆在首位。应谨慎使用后触发器,并且仅在不能使用前触发器时使用。这样做的一个原因是您不需要执行额外的 DML 来更改记录,因为在之前的触发器中您只需更改值并且插入/更新提交会自动发生。但是递归触发器触发是后触发器的主要问题。

避免触发器重新进入的一种快速方法是在一个类中使用公共静态布尔值,该类说明您是否已经在来自同一执行线程的此触发器中。

就像是:

public static Boolean isExecuting = false;

一旦设置为true,任何重新触发的触发代码都可以通过以下方式避免:

if(Class.isExecuting == false)
{
   Class.isExecuting = true;

   // Perform trigger logic
   // ...
}

此外,由于无法预先确定触发器执行的顺序,您可能会看到删除或其他数据更改的问题,这些问题取决于流程的其他部分首先完成。

此外,在不知道您的自定义唯一 3 部分密钥的详细信息的情况下,我想知道那里是否也存在问题,例如它是否真的是唯一的。不区分大小写是一个常见错误,这也是 Salesforce 中有 15 和 18 个字符 ID 的原因。例如,当人们导出到 Excel(不区分大小写的环境)并进行 VLOOKUP 时,他们偶尔会发现错误的记录。添加了 3 位计算后缀以消除不区分大小写环境的歧义。

于 2012-07-06T19:41:27.390 回答
2

谷歌搜索同样的错误导致我这篇文章:

http://boards.developerforce.com/t5/General-Development/Unable-to-obtain-exclusive-access-to-this-record/td-p/345319

这指出了发生这种情况的一些常见原因:

  1. 正在计算共享规则。
  2. 选项列表值已被替换并且正在进行替换。
  3. 正在创建/删除自定义索引。
  4. 最不可能的 - 其他人已经在编辑您试图同时访问的同一记录。

在这里张贴以防其他人需要它。

于 2013-02-22T15:31:52.320 回答
0

我今天多次收到此错误。结果我们的一个供应商在那段时间在同一个组织中更新了他们安装的包。各种各样的事情也出错了——在 DML 上抛出了一些对象验证异常,没有任何错误消息内容。

于 2014-01-15T18:37:28.670 回答
-1

解决方法 当尝试对已具有字段更新以导致汇总汇总字段进行计算的父对象进行字段更新(例如汇总汇总字段)时,将显示此错误。如果在主对象上运行触发器或另一个顶点作业并且它也尝试进行更新,则也可能发生这种情况。

如果出现此问题,您可以减少批量大小并重试,或者创建单独的较小文件以导入。

于 2013-04-12T13:51:18.830 回答