Comment corriger MIXED_DML_OPERATION dans les déploiements Salesforce
Apex tente de modifier un objet setup, comme User ou Group, et un objet non-setup dans la même transaction.
Se produit lors de : l'exécution Apex, le plus souvent pendant l'exécution des tests requise pour un déploiementCe que cela signifie
MIXED_DML_OPERATION est une exception à l'exécution Apex : Salesforce n'autorise pas le DML sur un objet setup (User, Group, GroupMember et similaires) et un objet non-setup (Account, Contact, objets personnalisés) au sein de la même transaction. Cela apparaît le plus souvent pendant l'exécution des tests Apex qu'un déploiement en production exige, se transformant en un échec de test qui bloque le déploiement.
Cette restriction existe car les objets setup peuvent modifier l'accès au niveau enregistrement et le partage, et Salesforce ne permet pas qu'une même transaction modifie à la fois qui peut voir les données et écrive ces données, ce qui explique pourquoi la correction concerne toujours les limites de transaction, jamais le contenu des enregistrements.
Causes courantes
La solution
- Déplacez le DML de l'objet setup dans sa propre transactionEnveloppez l'insertion du User ou du Group dans une méthode future, ou isolez-la autrement, afin qu'elle soit validée avant l'exécution du DML de l'objet business.
@future private static void insertUserAsync(String jsonUser) { User u = (User) JSON.deserialize(jsonUser, User.class); insert u; } - Utilisez Test.startTest() et Test.stopTest() pour scinder la transactionDans les tests, placez le DML de l'objet setup avant Test.startTest() afin qu'il s'exécute dans sa propre limite de transaction avant le DML de l'objet business.
- Ne combinez jamais les insertions d'objets setup et business dans un même contexte de triggerRefactorisez l'automatisation pour que les changements d'objet setup, comme le provisioning d'utilisateurs ou l'appartenance à un groupe, ne partagent jamais une transaction avec le DML d'enregistrements business.
Comment Serpent évite cela
Le pipeline CI de Serpent exécute la suite de tests Apex complète sur chaque tâche avant qu'elle ne soit éligible au merge, de sorte qu'un échec de test MIXED_DML_OPERATION apparaisse sur la tâche qui l'a introduit, et non sur une release en production. Voir la bibliothèque des erreurs de déploiement Salesforce.

Prévention
Erreurs associées
MIXED_DML_OPERATION, les réponses
Commencez gratuitement. Sans carte bancaire, sans installation, sans engagement.
Configuration en moins de 15 minutes. Aucune embauche DevOps nécessaire.
