【问题标题】:Salesforce.com: UNABLE_TO_LOCK_ROW, unable to obtain exclusive access to this recordSalesforce.com:UNABLE_TO_LOCK_ROW,无法获得对该记录的独占访问权
【发布时间】:2012-07-05 12:20:55
【问题描述】:

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

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

最近,一些更新的记录出现以下错误。 UNABLE_TO_LOCK_ROW,无法获得对该记录的独占访问权

请提供一些解决问题的方法

【问题讨论】:

  • 哪个 DML 在哪个触发器中抛出错误?
  • SalesRecords 的 upsert 抛出错误。

标签: triggers salesforce apex-code


【解决方案1】:

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

【讨论】:

    【解决方案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 位计算后缀以消除不区分大小写环境的歧义。

    【讨论】:

      【解决方案3】:

      谷歌搜索同样的错误将我带到这篇文章:

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

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          分辨率 当尝试对已具有字段更新以导致汇总汇总字段进行计算的父对象进行字段更新(例如汇总汇总字段)时,将显示该错误。如果在主对象上运行触发器或其他 apex 作业并且它也尝试执行更新,也会发生这种情况。

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

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-05
          • 2013-10-22
          • 2016-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-25
          • 2011-05-02
          相关资源
          最近更新 更多