ValidateScriptForCurrentDotUpdate

  • Rversion finale: Washingtondc
  • Mis à jour 1 févr. 2024
  • 3 minutes de lecture
  • Le validateur ValidateScriptForCurrentDotUpdate trouve les activités de workflow avec des scripts qui utilisent la fonction current.update().

    L’appel de current.update() entraîne des retards de performance importants dans le traitement des transactions et peut entraîner le blocage d’une instance.

    Résumé de la validation

    • Risque : dans le meilleur des cas, un workflow qui utilise current.update() dans les scripts voit ses performances se dégrader. Dans le pire des cas, le flux de travail entre dans une boucle récursive infinie qui fait planter le serveur.
    • Niveau de gravité : Avertissement
    • Résultat valide : valide
    • Message valide : Le script JavaScript de ce workflow ne contient aucune instance de 'current.update()'.
    • Résultat non valide : non valide
    • Message non valide : ce workflow utilise « current.update() » dans <nombre de références current.update> instructions JavaScript.
    • Action suggérée : supprimer current.update() des scripts d’activité cités par ce validateur. Les workflows s’exécutent au sein d’une transaction et actuel est mis à jour, voire inséré, à la fin de la transaction, selon les besoins. Il n’est pas nécessaire de mettre à jour explicitement l’enregistrement pendant la transaction.
    • Publiable : Oui
    • Exécutable : Oui

    Problèmes avec current.update() dans les scripts de workflow

    Un workflow lance l’exécution de l’une des façons suivantes :
    • Moteur de script : si un workflow est affecté à une table spécifique et qu’une condition d’exécution lui est attribuée, le workflow s’exécute sur INSERT.
    • Script : n’importe quelle règle métier, script include, script en arrière-plan ou script client peut initier un workflow à l’aide du script include du workflow et en appelant startFlow().

    Le moteur de workflow lance un workflow basé sur les critères correspondants de l’enregistrement actuel inséré. La transaction pour la tâche actuelle est gérée par le moteur de script et non par le workflow. Les workflows qui progressent sur la update() de l’enregistrement actuel ne sont pas invoqués via le moteur de workflow, mais sous la forme d’un appel à partir d’un script client ou d’une règle métier. Dans les deux cas, le moteur de script est invoqué et l’enregistrement actuel est placé en mémoire. Des modifications sont apportées à tous les champs actuels et sont disponibles pour d’autres activités et scripts exécutés dans la même transaction.

    Le cas échéant, d’autres moteurs qui s’exécutent en même temps que le moteur de workflow, tels que le moteur de règle métier ou la normalisation de champ, sont appelés pour la même transaction d’enregistrement en cours. Tous les changements apportés à la tâche actuelle par le biais de ces scripts et activités modifient l’enregistrement en mémoire. Ces valeurs changeantes sont disponibles à titre de référence dans toutes les autres transactions appelées à partir d’activités et de scripts dans la même transaction INSERT. Lorsque tous les changements attendus sont exécutés, l’enregistrement actuel est inséré.

    Lorsque l’un de ces scripts appelle current.update() sur un enregistrement qui n’a pas encore été inséré, l’action force une transaction de base de données inutile et sujette aux erreurs. Si un enregistrement n’est pas encore dans la base de données, il ne peut pas être mis à jour. Les règles métier qui se déclenchent sur update() sur un enregistrement en cours d’insertion peuvent provoquer une condition de bouclage très instable et potentiellement infinie.

    Dépannage

    Ce validateur détecte l’utilisation de current.update() dans n’importe quel champ de script modifiable. N’appelez pas current.update() à partir d’un script de workflow. Dans le cas d’une opération INSERT ou UPDATE de current, les modifications apportées à current sont disponibles pour tous les scripts s’exécutant dans la même transaction, et le moteur de script stocke toutes les modifications dans la base de données. Laissez la mise à jour du courant au moteur. Utilisez les scripts uniquement pour définir et référencer les valeurs de champ actuelles.