2017-09-07 18 views
6

Tôi có một chức năng mà tôi đã viết để tạo số liên tiếp. Các chức năng như sau:Nhận lỗi XDMP-LOCKED khi không có khóa nào tồn tại

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 
      } 
     ) 
}; 

chức năng hoạt động tốt từ một cửa sổ qconsole bằng cách sử dụng mã kiểm tra sau:

let res := util:generate-instrument-Id(1) 
return fn:error(fn:QName("test", $res)) 

tức là nó thực hiện trong một bối cảnh giao dịch và cập nhật các tài liệu một cách chính xác. Tuy nhiên, khi tôi cố gắng để gọi hàm tương tự từ một dịch vụ REST, nó sẽ trả về thông báo lỗi sau:

XDMP-LOCKED: xdmp:node-replace(fn:doc("/private/instrumentId-Sequence.xml")/instrument/@nextId, attribute{fn:QName("","nextId")}{"1228"}) -- Document or Directory is locked 

Xin lưu ý rằng tôi dọn dẹp mỗi đoạn mã khác từ giao diện dịch vụ để cô lập các vấn đề và vẫn nhận được thông báo lỗi tương tự.

Vì vậy, đây là những câu hỏi của tôi:

  • Trong những điều kiện lỗi này được ban hành?
  • Tôi chắc chắn không có ổ khóa nào được giữ trên tài liệu này (hoặc thư mục được đặt dưới) bởi bất kỳ quy trình nào khác, vì vậy điều gì có thể kích hoạt báo động giả như vậy?
  • Kể từ khi nó hoạt động từ qconsole, tôi giả sử nếu tôi nhân rộng những gì nó làm khi thực hiện chương trình tôi có thể giải quyết vấn đề này, là tốt. Bất kỳ tài liệu nào về cách qconsole thực thi chương trình?

Thanks a lot
K.

PS: Tôi sử dụng MarkLogic 9 trên máy chủ windows

+1

Có cơ hội nào mà hàm được gọi nhiều lần không? Ngoài ra, bạn có thể muốn chuyển vào ' các giao dịch khác nhau '. Đó không phải là mặc định cho lời gọi và eval. – grtjn

+0

@grtjn: Tôi thực sự đã thử nghiệm với một số tùy chọn cách ly khác nhau; không ai trong số họ có vẻ làm việc.nó cũng xuất hiện rằng giao dịch khác nhau là tùy chọn mặc định, như đã được chứng minh bằng cách thực hiện đúng chức năng trong qconsole. Và, không có cuộc gọi nào khác: để đảm bảo rằng tôi đã xóa mọi cuộc gọi khác trong mã dịch vụ và chỉ để lại cuộc gọi đến chức năng này –

+0

Nhân tiện, bạn có cân nhắc sử dụng id ngẫu nhiên không? Có những lý do tốt để thích rằng hơn id tuần tự. Xem ở đây để biết chi tiết: https://github.com/grtjn/ml-unique#how-it-works – grtjn

Trả lời

2

Sau khi một số đau đớn, tôi phát hiện ra rằng lý do tôi nhận được lỗi này. Có vẻ như đó là vì thực sự có một khóa được đặt trên thư mục "/" và khóa này không phải là khóa giao dịch.

Theo documentation, nó là một khóa dai dẳng được mua lại bởi WebDAV server.I thực sự nghi ngờ rằng có thể liên quan đến WebDAV và tôi vô hiệu hóa các dịch vụ WebDAV trên cơ sở dữ liệu, giả định rằng sẽ phát hành bất kỳ ổ khóa các dịch vụ sẽ tổ chức và tôi đã có thể viết thư cho doc bằng cách sử dụng qconsole anyways. Có vẻ như tài khoản quản trị có quyền bỏ qua các khóa liên tục do máy chủ webDAV tạo ra để chức năng hoạt động từ ngữ cảnh đó và máy chủ webDAV vô hiệu hóa sẽ không phát hành các khóa liên tục mà nó mua lại.

Vì vậy, tất cả những gì tôi phải làm để giải quyết vấn đề là giải phóng các ổ khóa treo xung quanh sau khi tôi tắt máy chủ webDAV.

Sau đó, tôi bật lại máy chủ webdav và chức năng tiếp tục hoạt động OK, điều đó có nghĩa là máy chủ wevDAV chỉ mua khóa theo một số điều kiện nhất định không được ghi lại.

Tôi nghĩ, tôi nên chia sẻ thông tin này để giúp những người khác có thể gặp cùng sự cố

Các vấn đề liên quan