Salesforce.com:UNABLE_TO_LOCK_ROW,无法获得对此记录的独占访问权限

时间:2012-07-05 12:20:56

标签: triggers salesforce apex-code

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

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

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

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

避免触发器重新进入的一种快速方法是在类中使用public static Boolean,该类指示您是否已从同一执行线程中处于此触发器中。

类似的东西:

public static Boolean isExecuting = false;

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

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

   // Perform trigger logic
   // ...
}

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

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

答案 2 :(得分:2)

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

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

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

  1. 正在计算共享规则。
  2. 已更换选项列表值并且正在进行更换。
  3. 正在进行自定义索引创建/删除。
  4. 最不可能的一个 - 其他人已经在编辑您同时尝试访问的同一条记录。
  5. 发布此处以防其他人需要。

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

分辨率 当正在尝试对已经具有字段更新的父对象进行字段更新(例如汇总摘要字段)以导致汇总汇总字段计算时,会显示错误。如果在主对象上运行触发器或另一个顶点作业并且它还尝试进行更新,也会发生这种情况。

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