2017-09-07 7 views
6

일련 번호 생성을 위해 작성한 함수가 있습니다. 함수는 다음과 같습니다잠금이 없을 때 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 : 나는 윈도우 서버 통증 후

+1

함수가 두 번 이상 호출 될 가능성이 있습니까? 또한 ' 다른 거래'을 전달할 수도 있습니다. 그것은 invoke 및 eval의 기본값이 아닙니다. – grtjn

+0

@ grtjn : 실제로 다른 격리 옵션으로 테스트했습니다. 그들 중 누구도 일하는 것 같지 않습니다.qconsole에서 함수가 올바르게 실행 됨으로써 입증 된 바와 같이, different-transaction이 기본 옵션 인 것처럼 보입니다. 그리고, 다른 호출은 없습니다 : 서비스 코드에서 다른 모든 호출을 제거하고이 함수에 대한 호출 만 남겨 두었습니다. –

+0

그런데 대신 임의의 ID를 사용하는 것이 좋습니다. 순차적 ID보다 더 선호하는 좋은 이유가 있습니다. 자세한 내용은 여기를 참조하십시오. https://github.com/grtjn/ml-unique#how-it-works – grtjn

답변

2

에 MarkLogic 9 사용, 나는 이유는 내가이 오류를받은 것을 발견했다. 실제로 "/"디렉토리에 잠금이 있었고이 잠금이 트랜잭션 잠금이 아니기 때문에 나타납니다.

documentation에 따라 WebDAV 서버에서 가져온 영구 잠금입니다. 실제로 웹DAV와 관련이있을 것으로 의심되어 데이터베이스에서 WebDAV 서비스를 사용할 수 없도록 설정했으며 해당 서비스가 보유 할 잠금을 해제한다고 가정합니다 어쨌든 qconsole을 사용하여 doc에 쓸 수있었습니다.

admin 계정에는 WebDAV 서버에서 생성 된 영구 잠금을 무시할 수있는 권한이 있으므로 해당 컨텍스트에서 작동하고 비활성화 된 WebDAV 서버는 획득 한 영구 잠금을 해제하지 않습니다.

그래서이 문제를 해결하기 위해해야 ​​할 일은 webDAV 서버를 비활성화 한 후에 걸려 있던 잠금 장치를 해제하는 것이 었습니다.

그런 다음 webdav 서버를 다시 활성화했으며 기능은 계속 작동합니다. 이는 wevDAV 서버가 문서화되지 않은 특정 조건에서만 잠금을 획득 함을 의미합니다.

나는 같은 정보를 볼 수있는 다른 사람들을 돕기 위해이 정보를 공유해야한다고 생각합니다.