ValidateScriptForCurrentDotUpdate
ValidateScriptForCurrentDotUpdateバリデーターは、current.update()関数を使用するスクリプトでワークフロー アクティビティを検出します。
呼び出し current.update() トランザクション処理で大幅なパフォーマンスの遅延が発生し、インスタンスがハングアップする可能性があります。
検証の要約
- リスク :良くても、 current.update() スクリプトのパフォーマンスが低下します。最悪の場合、ワークフローはサーバーをクラッシュさせる無限の再帰的ループに入ります。
- 重大度: 警告
- 有効な結果: 有効
- 有効なメッセージ :このワークフローのJavaScriptには、 'current.update()'のインスタンスがありません。
- 無効な結果: 無効
- 無効なメッセージ :このワークフローは、<current.update references> JavaScript文の<count>に 'current.update()'を使用します。
- 推奨アクション :削除 current.update() このバリデータによって引用されたアクティビティスクリプトから削除されます。ワークフローはトランザクション内で実行され、必要に応じて、トランザクションの最後に最新のものが挿入されます。トランザクション中にレコードを明示的に更新する必要はありません。
- パブリッシュ可能: はい
- 実行可能ファイル: はい
ワークフロースクリプトでのcurrent.update()の問題
- スクリプトエンジン :ワークフローが特定のテーブルに割り当てられ、実行条件が与えられている場合、ワークフローはINSERTで実行されます。
- スクリプト:ビジネスルール、スクリプトインクルード、バックグラウンドスクリプト、またはクライアントスクリプトは、ワークフロースクリプトincludeを使用してワークフローを開始し、startFlow()を呼び出すことができます。
ワークフローエンジンは、挿入されている現在のレコードの一致した基準に基づいてワークフローを開始します。現在のトランザクションは、ワークフローではなくスクリプトエンジンによって管理されます。現在のレコードのupdate()で進行するワークフローは、ワークフローエンジンを介して呼び出されるのではなく、クライアントスクリプトまたはビジネスルールからの呼び出しとして呼び出されます。いずれの場合も、スクリプトエンジンが呼び出され、現在のレコードがメモリに格納されます。現在のフィールドの編集と変更が行われ、同じトランザクションで実行される他のアクティビティとスクリプトで使用できます。
必要に応じて、ビジネスルールエンジンやフィールドの正規化など、ワークフローエンジンで順番に実行される他のエンジンが、同じ現在のレコードトランザクションに対して呼び出されます。これらのスクリプトとアクティビティを通じた現在の変更は、メモリ内のレコードを変更します。これらの変更された値は、同じINSERTトランザクション内のアクティビティおよびスクリプトから呼び出された他のトランザクションで参照するために使用できます。すべての変更が実行されると、現在のレコードが挿入されます。
これらのスクリプトの1つがまだ挿入されていないレコードでcurrent.update()を呼び出すと、そのアクションは不必要でエラーが発生しやすいデータベーストランザクションを強制します。レコードがまだデータベースにない場合は、レコードを更新することはできません。挿入中のレコードに対してupdate()をトリガするビジネスルールは、非常に不安定で潜在的に無限のループ状態を引き起こす可能性があります。
トラブルシューティング
このバリデータは、 current.update() いずれかの編集可能なスクリプトフィールドに入力します。ワークフロースクリプト内からcurrent.update()を呼び出さないでください。現在のINSERTまたはUPDATEの場合、現在の変更は同じトランザクションで実行されているすべてのスクリプトで使用でき、スクリプトエンジンはすべての変更をデータベースに保存します。現在のエンジンの更新をエンジンのままにしておきます。スクリプトは、現在のフィールド値を設定および参照するためにのみ使用してください。