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