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
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
@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 –
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