2012-07-05 155 views
0

在我们的生产组织独占访问,我们必须使用命令行数据加载上传销售数据到Salesforce的系统。该数据被加载到临时对象Temp。我们创建了一个公式字段(它结合了三个字段)以形成一个唯一的密钥。该对象的目的是减少用户手动创建密钥的工作量。Salesforce.com:UNABLE_TO_LOCK_ROW,无法获得这一纪录

有一个上温度其中要求该数据upserts到使用密钥另一个目的SALESDATA异步方法插入触发器之后。在SALESDATA插入/更新触发器检查的各个领域,并创建另一个对象SalesRecords /更新记录。插入/更新完成后,删除临时对象Temp中的所有记录。该SalesRecords对象上没有任何触发,是另一个对象销售的孩子。对象具有一些汇总字段,这些字段汇总了销售记录对象的字段。

最近,我们提示以下错误:对于一些被更新的记录。 UNABLE_TO_LOCK_ROW,无法获得这一纪录

独占访问,请您提供一些指引,以解决问题

+0

哪个DML触发器在抛出err? – 2012-07-07 05:59:37

+0

SalesRecords的upsert正在抛出错误。 – ntnng 2012-07-10 05:07:08

回答

2

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

2

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

一个快速的方式,以避免触发再入是,指出无论你从执行的同一个线程这触发已经是一个类使用公共静态布尔。

是这样的:

public static Boolean isExecuting = false; 

一旦设置到true,任何触发代码,重新火可以用来避免:

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

    // Perform trigger logic 
    // ... 
} 

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

而且,不知道您的自定义独特的三部分关键的细节,我想,如果有一个问题,有太多如它是否是真正独特的或不知道。不区分大小写是常见错误,这是Salesforce中存在15个字符和18个字符的原因。例如,当人们输出到Excel(不区分大小写的环境)并执行VLOOKUP时,他们偶尔会发现错误的记录。为了区分大小写不敏感的环境,添加了3位数后缀。

2

谷歌搜索同样的错误导致我这个帖子:

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

其中指出一些常见的原因要做到这一点:

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

张贴在这里万一有人需要它。

-1

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

如果发生此问题,您可以减少批量大小并再次尝试或创建要导入的单独较小文件。

+0

至少请访问您的网站:http://help.salesforce.com/apex/HTViewSolution?id=000130351&language=en_US – 2013-06-18 13:08:06

0

今天我得到了这个错误多次。原来我们的供应商之一是在同一组织中更新其已安装的软件包。各种各样的东西也出错了 - 一些对象验证异常正在DML上抛出,没有任何错误信息内容。