Triggers Salesforce.com:无法锁定行,无法以独占方式访问此记录

Triggers Salesforce.com:无法锁定行,无法以独占方式访问此记录,triggers,salesforce,apex-code,Triggers,Salesforce,Apex Code,在我们的生产组织中,我们有一个使用命令行数据加载器将销售数据上传到Salesforce的系统。此数据加载到临时对象Temp。我们创建了一个公式字段(包含三个字段)以形成一个唯一的键。该对象的目的是减少用户手动创建密钥的工作量 Temp上有一个after insert触发器,它调用一个异步方法,该方法使用键将数据上传到另一个对象SalesData。SalesData上的插入/更新触发器检查各个字段,并在另一个对象SalesRecords中创建/更新记录。插入/更新完成后,将删除temp objec

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

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

最近,我们得到以下一些更新记录的错误。 无法锁定行,无法以独占方式访问此记录


请提供一些指针来解决问题

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

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

我有点惊讶您能在一开始就实现这一点。应谨慎使用后触发器,并且仅当不能使用前触发器时才使用。这样做的一个原因是,您不需要执行额外的DML来更改记录,因为在before触发器中,您只需更改值,插入/更新提交就会自动进行。但是递归触发器触发是after触发器的主要问题

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

比如:

public static Boolean isExecuting = false;
一旦设置为
true
,可通过以下方式避免任何再次触发的触发代码:

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

   // Perform trigger logic
   // ...
}
此外,由于无法预先确定触发器的执行顺序,您可能会看到删除或其他数据更改的问题,这些问题依赖于流的其他部分首先完成


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

我有点惊讶,您能够在第一时间实现这一点。应谨慎使用后触发器,并且仅当不能使用前触发器时才使用。这样做的一个原因是,您不需要执行额外的DML来更改记录,因为在before触发器中,您只需更改值,插入/更新提交就会自动进行。但是递归触发器触发是after触发器的主要问题

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

比如:

public static Boolean isExecuting = false;
一旦设置为
true
,可通过以下方式避免任何再次触发的触发代码:

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

   // Perform trigger logic
   // ...
}
此外,由于无法预先确定触发器的执行顺序,您可能会看到删除或其他数据更改的问题,这些问题依赖于流的其他部分首先完成


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

通过谷歌搜索同样的错误,我将看到以下帖子:

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

  • 正在计算共享规则
  • 已替换选取列表值,正在进行替换
  • 正在创建/删除自定义索引
  • 最不可能的情况是,其他人已经在编辑您试图同时访问的同一记录

  • 在这里发布,以防其他人需要它。

    通过谷歌搜索同样的错误,我会找到这篇文章:

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

  • 正在计算共享规则
  • 已替换选取列表值,正在进行替换
  • 正在创建/删除自定义索引
  • 最不可能的情况是,其他人已经在编辑您试图同时访问的同一记录
  • 在这里发布,以防其他人需要它。

    解决方案 当输入字段时会显示错误