Loading

‘您有未提交的工作等待处理。请在调用前提交或回滚”错误

发布日期: Apr 24, 2026
描述

当有未提交的事务挂起时,不允许调用。例如,如果在 DML 操作之前设置了保存点,则不能根据该操作的结果进行调用以提交或回滚保存点

示例场景:
当尝试保存点时,插入客户以查找重复项并回滚,然后插入 Web 服务调用以将客户数据发送到外部系统。但是在调用 Web 服务之前,您可能会看到错误“您有未提交的工作等待处理”。请在调用前提交或回滚。”

 
以下步骤可能会导致此错误: 
  1. 您在 UI 上输入信息以创建新客户,然后单击保存。 
  2. 系统创建保存点,然后插入客户记录。 
  3. 触发器激发以查找重复项。
  4. 如果没有重复,它将根据步骤 2 中设置的保存点回滚客户记录插入。 
  5. 系统将调用 Web 服务,以便将新的客户数据发送到外部系统,并获得外部 ID。
  6. 系统将新客户连同外部 ID 一起存储在 SFDC。


 
解决方案

您不能在请求上下文中对待办事务进行调用。此外,还无法进行显式提交。因此,解决方法是在单独的上下文中进行调用。 
不能在调用之前执行 DML 操作。只能在完成该调用后,才可以调用所有的 DML 操作。因此,首先进行 Web 服务调用,然后保存请求。
如果您正在进行多个调用,则将所有请求保存在列表或地图中,并在保存后发布调用。
按照以下顺序执行步骤将会奏效 
查询
调用
查询
调用
插入
调用
调用 
调用
插入或更新

以下步骤将失败:
调用
插入
调用 <---- 在此处失败
  1. 您需要提交事务,在任何数据库更改之前进行调用,或者将调用移动到 @future 方法(将 @future 注释放到 Web 服务方法中)。
  2. 将事务分成两个独立的 Ajax 进程。第一个插入记录,第二个执行标注,并且能够更新新插入的记录。
  3. 您可以保存记录,然后在进行第二次回拨以执行调用时,使用带有“加载”消息的临时页面对用户做出响应。为了使它看起来无缝,您还可以连续调用 AJAX 来保存记录,并在用户单击“保存”按钮时看到“加载”消息时进行调用。
  4. 如果不想在 Web 服务方法中放置 @future 注释,可以执行一个操作来插入对象,然后在 commandButton 的完整事件上执行 Web 服务调用。然后,返回 PageReference,给用户提供即时反馈。如果 Web 服务调用返回任何错误,则删除该对象并将用户返回到同一页面。
VisualForce 页面
<apex:actionFunction name="executeWS" action="{!executeWS}"></apex:actionFunction>  <apex:commandButton value="Save" action="{!save}" oncomplete="executeWS()" />
控制器
public PageReference save() {  insert obj; } public PageReference executeWS(){  obj = [SELECT ...];  try{ callout ws;  } catch(System.Exception ex){ delete obj; ApexPages.addMessages(e); return null;  }  return new PageReference('/' + id); }

有关更多信息,请参见此处的相关链接:错误 - “当前不支持来自触发器的调用”
知识文章编号

000385708

 
正在加载
Salesforce Help | Article