ValidateScriptForCurrentDotUpdate

  • Rversion finale: Xanadu
  • Mis à jour 1 août 2024
  • 3 minutes de lecture
  • Le validateur ValidateScriptForCurrentDotUpdate trouve les activités du 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, les performances d’un workflow qui utilisent current.update() dans les scripts sont dégradées. Dans le pire des cas, le workflow entre dans une boucle récursive infinie qui fait planter le serveur.
    • Niveau de gravité : Avertissement
    • Résultat valide : valide
    • Message valide : le JavaScript dans ce workflow n’a pas d’instances 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 current est mis à jour, voire inséré, à la fin de la transaction, selon le cas. 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 en utilisant le script include de workflow et en appelant startFlow().

    Le moteur de workflow lance un workflow basé sur les critères correspondants de l’enregistrement en cours d’insertion. La transaction pour la version actuelle est gérée par le moteur de script et non par le workflow. Les workflows qui progressent sur la mise à jour () 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. Les changements et modifications apportés à tous les champs actuels sont effectués 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 séquence avec le moteur de workflow, tels que le moteur de règle métier ou la normalisation de champ, sont invoqués pour la même transaction d’enregistrement en cours. Tous les changements apportés à la mise en cours par le biais de ces scripts et activités modifient l’enregistrement en mémoire. Ces valeurs changeantes sont disponibles pour 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 qui est 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 lequel des champs de script modifiables. N’appelez pas current.update() à partir d’un script de workflow. Dans le cas d’un INSERT ou d’un 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 tous les changements 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.