ValidateScriptForCurrentDotUpdate
ValidateScriptForCurrentDotUpdate 유효성 검사기는 current.update() 함수를 사용하는 스크립트가 있는 워크플로 활동을 찾습니다.
current.update()를 호출하면 트랜잭션 처리에서 상당한 성능 지연이 발생하고 인스턴스가 정지될 수 있습니다.
확인 요약
- 위험: 기껏해야 스크립트에서 current.update() 를 사용하는 워크플로는 성능이 저하됩니다. 최악의 경우 워크플로가 무한 재귀 루프에 들어가 서버가 충돌합니다.
- 심각도 수준: 경고
- 유효한 결과: 유효
- 유효한 메시지: 이 워크플로우의 JavaScript에는 "current.update()"의 인스턴스가 없습니다.
- 잘못된 결과: 잘못된
- 잘못된 메시지: 이 워크플로우는 current.update 참조의 <수> JavaScript 문에서 "current.update()"를 사용합니다.
- 제안된 조치: 이 유효성 검사기가 인용한 활동 스크립트에서 current.update() 를 제거하십시오. 워크플로는 트랜잭션 내에서 실행되며 current는 트랜잭션의 끝에 적절하게 업데이트되거나 삽입될 수 있습니다. 트랜잭션 중에 레코드를 명시적으로 업데이트할 필요가 없습니다.
- 게시 가능: 예
- 실행 가능: 예
워크플로 스크립트의 current.update() 관련 문제
- 스크립트 엔진: 워크플로우가 특정 테이블에 할당되고 실행 조건이 지정된 경우 워크플로우는 삽입 시 실행됩니다.
- 스크립트: 모든 비즈니스 규칙, 스크립트 포함, 백그라운드 스크립트 또는 클라이언트 스크립트는 워크플로우 스크립트 포함과 호출 startFlow()를 사용하여 워크플로우를 시작할 수 있습니다.
워크플로우 엔진은 삽입 중인 현재 기록의 일치하는 기준에 따라 워크플로우를 시작합니다. 현재에 대한 트랜잭션은 워크플로우가 아닌 스크립트 엔진에 의해 관리됩니다. 현재 기록의 update() 에서 진행되는 워크플로우는 워크플로우 엔진을 통해 호출되지 않고 클라이언트 스크립트 또는 비즈니스 규칙의 호출로 호출됩니다. 두 경우 모두 스크립트 엔진이 호출되고 현재 레코드가 메모리에 저장됩니다. 현재 필드를 편집하고 수정하면 동일한 트랜잭션에서 실행되는 다른 활동과 스크립트에 사용할 수 있습니다.
적절한 경우 비즈니스 규칙 엔진이나 필드 정규화처럼 워크플로우 엔진과 함께 순서대로 실행되는 다른 엔진이 동일한 현재 레코드 트랜잭션에 대해 호출됩니다. 이러한 스크립트와 활동을 통해 current를 변경하면 메모리의 레코드가 수정됩니다. 이러한 변경 값은 동일한 INSERT 트랜잭션의 활동 및 스크립트에서 호출된 다른 트랜잭션에서 참조할 수 있습니다. 예상되는 모든 변경 내용이 실행되면 현재 기록이 삽입됩니다.
이러한 스크립트 중 하나가 아직 삽입되지 않은 레코드에 대해 current.update() 를 호출하면 이 작업은 불필요하고 오류가 발생하기 쉬운 데이터베이스 트랜잭션을 강제로 적용합니다. 데이터베이스에 기록이 아직 없으면 업데이트할 수 없습니다. 삽입 중인 레코드의 update() 에서 트리거되는 비즈니스 규칙으로 인해 매우 불안정하고 무한 반복 상태가 발생할 수 있습니다.
문제 해결
이 유효성 검사기는 편집 가능한 스크립트 필드에서 current.update() 사용을 감지합니다. 워크플로 스크립트 내에서 current.update( )를 호출하지 마십시오. current의 INSERT 또는 UPDATE의 경우 current에 대한 변경 내용은 동일한 트랜잭션에서 실행되는 모든 스크립트에서 사용할 수 있으며 스크립트 엔진은 모든 변경 내용을 데이터베이스에 저장합니다. 전류 업데이트는 엔진에 맡기십시오. 현재 필드 값을 설정하고 참조하기 위해서만 스크립트를 사용하십시오.