ValidateScriptForCurrentDotUpdate

  • Freigeben Version: Zurich
  • Aktualisiert 31. Juli 2025
  • 2 Minuten Lesedauer
  • Der ValidateScriptForCurrentDotUpdate-Prüfer sucht Workflow-Aktivitäten mit Skripten, die die Funktion current.update() verwenden.

    Das Aufrufen von current.update() verursacht erhebliche Leistungsverzögerungen bei der Transaktionsverarbeitung und kann dazu führen, dass eine Instanz hängen bleibt.

    Validierungszusammenfassung

    • Risiko: Bestenfalls kommt es bei einem Workflow, dercurrent.update() in Skripts verwendet zu Leistungseinbußen. Im schlimmsten Fall tritt der Workflow in eine unendliche, rekursive Schleife ein, die den Server zum Absturz bringt.
    • Schweregrad: Warnung.
    • Gültiges Ergebnis: Gültig
    • Gültige Nachricht: Das JavaScript in diesem Workflow hat keine Instanzen von 'current.update ()'.
    • Ungültiges Ergebnis: Ungültig
    • Ungültige Nachricht: Von diesem Workflow wird 'current.update ()' in den <count of current.update references> JavaScript-Anweisungen verwendet.
    • Vorgeschlagene Aktion : Löschen Sie current.update() aus den Aktivitätsskripten, die von diesem Prüfer zitiert werden. Workflows werden innerhalb einer Transaktion ausgeführt, und „current“ wird aktualisiert oder gegebenenfalls am Ende der Transaktion eingefügt. Es ist nicht erforderlich, den Datensatz während der Transaktion explizit zu aktualisieren.
    • Publizierbar: Ja
    • Lauffähig: Ja

    Probleme mit current.update() in Workflow-Skripten

    Ein Workflow leitet die Ausführung auf eine der folgenden Arten ein:
    • Skript-Engine: Wenn ein Workflow einer bestimmten Tabelle zugewiesen wird und eine Ausführungsbedingung erhält, wird der Workflow in INSERT ausgeführt.
    • Skript: Jede Busniess Rule, Skripteinbindung, jedes Hintergrundskript oder Clientskript kann einen Workflow mithilfe der Workflow-Skripteinbindung und durch Aufruf von startFlow() initiieren.

    Die Workflow-Engine initiiert einen Workflow basierend auf den übereinstimmenden Kriterien des aktuellen Datensatzes, der eingefügt wird. Die Transaktion für„ current“ wird von der Skript-Engine und nicht vom Workflow verwaltet. Workflows, die auf Grundlage von update() des aktuellen Datensatzes ausgeführt werden, werden nicht über die Workflow-Engine aufgerufen, sondern als Aufruf eines Clientskripts oder einer Business Rule. In beiden Fällen wird die Skript-Engine aufgerufen und der aktuelle Datensatz wird gespeichert. Es werden Bearbeitungen und Änderungen an allen aktuellen Feldern vorgenommen und sie stehen anderen Aktivitäten und Skripts zur Verfügung, die in derselben Transaktion ausgeführt werden.

    Gegebenenfalls werden andere Engines, die nacheinander mit der Workflow-Engine ausgeführt werden, z. B. die Business-Rule-Engine oder die Feldnormalisierung, für dieselbe aktuelle Datensatztransaktion aufgerufen. Alle durch diese Skripts und Aktivitäten an „current“ vorgenommenen Änderungen ändern den Datensatz im Speicher. Diese sich ändernden Werte sind als Referenz für alle anderen Transaktionen verfügbar, die von Aktivitäten und Skripts in derselben INSERT-Transaktion aufgerufen werden. Wenn alle erwarteten Änderungen ausgeführt werden, wird der aktuelle Datensatz eingefügt.

    Wenn eines dieser Skripte current.update() für einen Datensatz aufruft, der noch eingefügt werden muss, erzwingt die Aktion eine unnötige und fehleranfällige Datenbanktransaktion. Wenn sich ein Datensatz noch nicht in der Datenbank befindet, kann er nicht aktualisiert werden. Business Rules, die bei update() bei einem Datensatz ausgelöst werden, der gerade eingefügt wird, kann dies zu sehr instabilen und möglicherweise unendlichen Schleifen führen.

    Problembehandlung

    Der Prüfer erkennt die Verwendung von current.update() in allen bearbeitbaren Skriptfeldern. Rufen Sie current.update() nicht aus einem Workflow-Skript heraus auf. Bei einem INSERT- oder UPDATE-Wert von „current“ stehen die an „current“ vorgenommenen Änderungen für alle Skripts zur Verfügung, die in derselben Transaktion ausgeführt werden, und die Skript-Engine speichert alle Änderungen in der Datenbank. Überlassen Sie die Aktualisierung von „current“ der Engine. Verwenden Sie die Skripts nur zum Einstellen und Referenzieren der aktuellen Feldwerte.