Loading
Salesforce から送信されるメールは、承認済ドメインからのみとなります続きを読む

エラー - 「You have uncommitted work pending.Please commit or rollback before calling out」 (未確定の作業が保留中です。コールアウトを実行する前に確定またはロールバックしてください)

公開日: Apr 24, 2026
説明

未確定のトランザクションが保留中の場合は、コールアウトを実行できません。たとえば、DML 操作の前にセーブポイントが設定されている場合、その操作の結果に基づいてコールアウトを実行してセーブポイントを確定またはロールバックすることはできません。

サンプルシナリオ:
セーブポイントを実行するため、重複やロールバックを探すための取引先を挿入し、Web サービスコールアウトによって取引先データを外部システムに送信します。しかし、Web サービスが呼び出される前に、「You have uncommitted work pending.Please commit or rollback before calling out.」 (未確定の作業が保留中です。コールアウトを実行する前に確定またはロールバックしてください。) エラーが発生します。

 
次のステップではこのエラーが発生する可能性があります。
  1. 新しい顧客を作成するための情報を UI に入力して [保存] をクリックします。
  2. システムはセーブポイントを作成し、顧客レコードを挿入します。
  3. トリガーにより、重複の検索が開始されます。
  4. 重複が見つからなければ、ステップ 2 で設定されているセーブポイントに基づいて顧客レコードの挿入がロールバックされます。
  5. システムは Web サービスを呼び出して、新しい顧客データを外部システムに送信し、externalID を取得します。
  6. システムは新しい顧客を外部 ID と一緒に SFDC に保存します。


他のシナリオには、System.enqueueJob、Database.executeBatch、Future メソッドなどの非同期キュー プロセスによる未確定の作業があります。 
解決策

要求コンテキストに保留中のトランザクションがある場合には、コールアウトを実行できません。確定を明示的に実行することもできません。この場合は、回避策として別のコンテキストでコールアウトを実行します。 
コールアウトの前に DML 操作を実行することはできません。 すべての DML 操作は、コールアウトの完了後に呼び出す必要があります。したがって、Web サービスのコールアウトを先に実行してから要求を保存します。
複数のコールアウトを実行する場合は、すべての要求をリストまたはマップに保存し、保存後にコールアウトを POST 送信します。
次の順序でステップを実行すれば正常に機能します。 
クエリ
コールアウト
クエリ
コールアウト
コールアウト
挿入または更新

次の順序では失敗します。
コールアウト
挿入
コールアウト
  1. トランザクションを確定するか、データベースの変更前にコールアウトを実行するか、または (@future アノテーションを webservice メソッドに配置して) コールアウトを @future メソッドに移動する必要があります。
  2. トランザクションを 2 つの Ajax プロセスに分割します。最初のプロセスはレコードを挿入し、2 番目のプロセスはコールアウトを実行して新たに挿入されたレコードを更新します。
  3. レコードを保存してから、コールアウトを実行するための 2 つ目のコールを行っている間に、「読み込み中」のメッセージのページを一時的にユーザーに表示します。ユーザーが [保存] ボタンをクリックしたら、レコードを保存してコールアウトを実行するための Ajax コールを連続して実行することで、「読み込み中」のメッセージを表示させて動作をシームレスに見せることができます。
  4. @future アノテーションを webservice メソッドに配置したくない場合は、オブジェクトを挿入するアクションを実行してから、commandButton の oncomplete イベントで webservice コールアウトを実行することもできます。その後、PageReference を返すことでユーザーにフィードバックを即座に提供します。 webservice コールアウトがエラーを返した場合は、オブジェクトを削除して、ユーザーには同じページを表示します。
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);}
注意: 将来のキューまたはキュー可能キューは未確定の作業であり、コールアウトの前に実行することはできません。
詳細は、「 Error - 'Callout from triggers are currently not supported' (エラー - 'トリガーからのコールアウトは現在サポートされていません'」を参照してください。
ナレッジ記事番号

000385708

 
読み込み中
Salesforce Help | Article