일련 번호 생성을 위해 작성한 함수가 있습니다. 함수는 다음과 같습니다잠금이 없을 때 XDMP-LOCKED 오류가 발생합니다.
declare function generate-instrument-Id($cnt as xs:int?)
as xs:int {
let $count := if($cnt and $cnt > 0) then $cnt else 1
let $url := '/private/instrumentId-Sequence.xml'
(: this redirection is needed to write id in another
transaction context :)
return xdmp:invoke-function(function() {
let $id := fn:doc($url)/instrument/@nextId
let $_ := xdmp:node-replace($id
, attribute nextId { $id + $count })
return $id
}
)
};
기능은 다음과 같은 테스트 코드를 사용하여 qconsole 창에서 잘 작동 :
let res := util:generate-instrument-Id(1)
return fn:error(fn:QName("test", $res))
즉이 다른 트랜잭션 컨텍스트에서 실행하고 문서를 올바르게 업데이트합니다. 난 아직도 문제를 분리하는 서비스 인터페이스의 코드의 다른 모든 부분을 정리하고 있음을
XDMP-LOCKED: xdmp:node-replace(fn:doc("/private/instrumentId-Sequence.xml")/instrument/@nextId, attribute{fn:QName("","nextId")}{"1228"}) -- Document or Directory is locked
참고 : 나는 REST 서비스에서 같은 함수를 호출 할 때 그러나, 다음과 같은 오류 메시지를 반환 같은 오류 메시지가 나타납니다. 이 오류가 발행
- 어떤 조건 :
그래서 여기 내 질문입니까?
- 다른 프로세스에서이 문서 (또는 디렉토리)에 대한 잠금이 설정되어 있지 않으므로 이러한 잘못된 경보가 발생할 수 있습니다.
- qconsole에서 작동하기 때문에이 문제를 해결할 수있는 프로그램을 실행할 때 무엇을 복제하면 가정합니다. qconsole이 프로그램을 실행하는 방법에 관한 모든 문서?
덕분에 많은
K.
PS : 나는 윈도우 서버 통증 후
함수가 두 번 이상 호출 될 가능성이 있습니까? 또한 ' 다른 거래 '을 전달할 수도 있습니다. 그것은 invoke 및 eval의 기본값이 아닙니다. –
grtjn
@ grtjn : 실제로 다른 격리 옵션으로 테스트했습니다. 그들 중 누구도 일하는 것 같지 않습니다.qconsole에서 함수가 올바르게 실행 됨으로써 입증 된 바와 같이, different-transaction이 기본 옵션 인 것처럼 보입니다. 그리고, 다른 호출은 없습니다 : 서비스 코드에서 다른 모든 호출을 제거하고이 함수에 대한 호출 만 남겨 두었습니다. –
그런데 대신 임의의 ID를 사용하는 것이 좋습니다. 순차적 ID보다 더 선호하는 좋은 이유가 있습니다. 자세한 내용은 여기를 참조하십시오. https://github.com/grtjn/ml-unique#how-it-works – grtjn