Comment corriger ALL_OR_NONE_OPERATION_ROLLED_BACK dans les déploiements Salesforce

Un seul enregistrement défaillant dans un lot soumis avec allOrNone=true a annulé tous les enregistrements de ce lot, y compris les valides.

Se produit lors : d'opérations DML en masse, de chargements de données et de la configuration de tests Apex

Ce que cela signifie

ALL_OR_NONE_OPERATION_ROLLED_BACK signifie qu'une opération DML a été soumise avec allOrNone défini sur true, et qu'au moins un enregistrement du lot a échoué à la validation, si bien que Salesforce a annulé tout le lot au lieu de valider les enregistrements individuellement corrects. C'est le comportement attendu d'allOrNone, pas un bug, mais cela peut coûter cher sur de gros lots.

Cela survient partout où du DML en masse s'exécute : un appel Database.insert(records, true) en Apex, un job Bulk API avec l'option allOrNone activée, ou une session Data Loader avec "Insert null values" et le succès partiel tous deux désactivés. Une seule ligne défaillante n'importe où dans le lot entraîne toute la transaction avec elle.

Diagnostic

Causes courantes

Un enregistrement dans un lot important échoue à la validation
Une valeur de liste de sélection incorrecte, un champ obligatoire manquant, ou une règle de validation échouée sur un seul enregistrement invalide tout le lot allOrNone.
Les types d'enregistrements mixtes n'ont pas été pré-validés
Un lot mélange des enregistrements de sources ou de formes différentes sans vérifier chacun d'eux au préalable par rapport aux règles de validation de l'objet.
Les lots n'ont pas été découpés
L'étape de données d'un déploiement important soumet un seul lot très volumineux au lieu de le diviser en groupes plus petits et mieux isolés des échecs.

La solution

  1. Valider les enregistrements côté client avant l'envoi
    Vérifiez les conditions d'échec évidentes, champs obligatoires, valeurs de liste de sélection, par rapport aux règles de l'objet avant d'envoyer le lot.
  2. Définir allOrNone=false pendant les passes de migration
    Exécutez les migrations avec allOrNone=false afin que les échecs individuels ne bloquent pas le reste du lot, puis examinez et corrigez les enregistrements en échec.
  3. Découper les lots volumineux en groupes plus petits
    Divisez une opération de données volumineuse en lots plus petits afin qu'un seul enregistrement défaillant n'affecte qu'une petite partie du chargement total.
    List<SObject> chunk = new List<SObject>();
    for (Integer i = 0; i < records.size(); i++) {
        chunk.add(records[i]);
        if (chunk.size() == 200 || i == records.size() - 1) {
            Database.insert(chunk, false);
            chunk.clear();
        }
    }
En pratique

Comment Serpent évite cela

Les opérations de données de Serpent sont découpées en lots et validées dans le cadre du pipeline, de sorte qu'un seul enregistrement défaillant dans une migration apparaît tôt sur un petit lot au lieu d'annuler un lot important en plein milieu d'un déploiement. Consultez la bibliothèque des erreurs de déploiement Salesforce.

Tableau de bord des releases avec alertes de conflit dans Serpent

Prévention

Utiliser allOrNone=false par défaut pour les chargements en masse
Traitez allOrNone=true comme l'exception pour les cas où un succès partiel est réellement inacceptable, pas comme le réglage par défaut de chaque job en lot.
Pré-valider avant la soumission
Faites passer les enregistrements entrants par une vérification de schéma légère, champs obligatoires, valeurs de liste de sélection, avant qu'ils n'atteignent l'appel DML.
Concevoir les migrations avec des tailles de lot fixes dès le premier jour
Construisez les chargements de données pour qu'ils soient soumis en lots de taille fixe, 200 à 2 000 enregistrements, dès le départ plutôt que d'ajouter le découpage après un échec.
Questions fréquentes

ALL_OR_NONE_OPERATION_ROLLED_BACK, expliqué

allOrNone est-il toujours le mauvais réglage à utiliser ?
Non. C'est le bon choix lorsqu'un succès partiel est inacceptable, comme un ensemble d'enregistrements financiers qui doivent être comptabilisés ensemble ; c'est simplement coûteux lorsqu'il est utilisé sur de gros lots faiblement validés.
allOrNone=true annule-t-il aussi les effets secondaires des déclencheurs Apex ?
Oui. Salesforce annule toute la transaction, y compris tout DML qu'un déclencheur a effectué sur d'autres objets, pas seulement les enregistrements soumis directement.
Comment trouver quel enregistrement précis a échoué dans un lot important ?
Le tableau SaveResult (ou le résultat du job Bulk API) contient une entrée par enregistrement soumis, chacune avec son propre indicateur de succès et sa liste d'erreurs ; parcourez-le pour isoler l'échec.

Démarrez gratuitement. Sans carte bancaire, sans installation, sans engagement.

Configuration en moins de 15 minutes. Aucun recrutement DevOps nécessaire.

Curieux de livrer plus vite avant de vous lancer ? Parlons-en

Sans engagement.