Loading

'Você tem um trabalho não comprometido pendente. Confirme ou reverta antes de chamar erro'.

Data da publicação: Apr 24, 2026
Descrição

Textos explicativos não são permitidos quando há uma transação pendente não confirmada. Por exemplo, se um ponto de salvamento é definido antes de uma operação DML, um texto explicativo não pode ser feito com base nos resultados dessa operação para confirmar ou reverter o ponto de salvamento.

Exemplo de cenário:
Ao tentar fazer um ponto de salvamento, insira a conta para encontrar duplicatas e rollback e, em seguida, uma chamada de serviço da web para enviar os dados da conta para um sistema externo. Mas antes que o serviço da web seja chamado, você poderá ver o erro 'Você tem um trabalho não confirmado pendente. Confirme ou reverta antes de chamar'.
 
As etapas a seguir podem resultar neste erro:
  1. Você insere informações na IU para criar um novo cliente e clica em Salvar.
  2. O sistema cria um ponto de salvamento e insere o registro do cliente.
  3. Ativa disparos para encontrar duplicatas.
  4. Se não houver duplicatas, ele reverterá a inserção de registro do cliente com base no ponto de salvamento definido na etapa 2.
  5. O sistema irá chamar um serviço da web para enviar os novos dados do cliente para o sistema externo e obter um externalID de volta.
  6. O sistema armazena o novo cliente no SFDC junto com o ID externo.


 
Resolução

Você não pode fazer chamadas com transações pendentes no contexto da solicitação. Além disso, não é possível fazer um commit explícito. Portanto, uma solução alternativa é fazer o texto explicativo em um contexto separado.
Você não pode executar uma operação DML antes de um texto explicativo. Todas as operações DML devem ser chamadas somente depois que você terminar com as chamadas. Portanto, primeiro faça uma chamada de serviço da web e salve a solicitação.
Se você estiver fazendo várias chamadas, salve todas as solicitações em uma lista ou mapa e publique as chamadas que você salvou.
Seguir as etapas neste pedido funcionará
inquerir
chamar
inquerir
chamar
inserir
chamar
chamar
chamar
inserir ou atualizar

O seguinte cenário de etapas falhará: -
chamar
inserir
chamar <---- falha aqui
  1. Você precisa confirmar a transação, fazer a chamada antes de quaisquer alterações no banco de dados ou mover sua chamada para um método @future (coloque a anotação @future no método webservice).
  2. Divide a transação em dois processos Ajax separados. O primeiro insere o registro e o segundo executa a chamada e é capaz de atualizar o registro recém-inserido.
  3. Você pode salvar os registros e responder ao usuário com uma página temporária com uma mensagem "Carregando" ao fazer a segunda chamada de volta para executar o texto explicativo. Para fazer com que pareça uniforme, você também pode fazer chamadas AJAX sucessivas para salvar registros e fazer uma chamada conforme o usuário vê a mensagem "Carregando" ao clicar no botão "Salvar".
  4. Se você não quiser colocar a anotação @future no método webservice, pode executar uma ação para inserir o objeto e, em seguida, executar a chamada do webservice no evento oncomplete de um commandButton. Em seguida, retorne um PageReference dando feedback imediato ao usuário. Se a chamada de serviço da web retornar algum erro, exclua o objeto e retorne o usuário à mesma página.

Página VisualForce
<apex:actionFunction name="executeWS" action="{!executeWS}"></apex:actionFunction>
 <apex:commandButton value="Save" action="{!save}" oncomplete="executeWS()" />
Controlador
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);
}

Para obter mais informações, aqui está um link relacionado em Erro - 'Chamadas de acionadores não são suportadas no momento'.
Número do artigo do Knowledge

000385708

 
Carregando
Salesforce Help | Article