1

我们有一些需要版本控制的业务需求。为此,我们选择使用 MarkLogic 库服务。我们在使用 XRAY 测试代码和使用事务时遇到问题。

我们的测试如下:

declare function should-save-with-version-when-releasing() {
declare option xdmp:transaction-mode "update";

    let $uri := '/some-document-uri.xml'         
    let $document := fn:doc($uri) 
    let $pre-release-version := c:get-latest-version($uri)
    let $post-release-version := c:get-latest-version($uri)
    let $result := mut:release($document) (:this should version up:)

    return (assert:not-empty($pre-release-version), 
            assert:not-empty($result), 
            assert:not-equal($pre-release-version,$post-release-version),
            xdmp:rollback())

无论如何,测试都会通过,事实证明 ML 回滚会破坏所有变量。

我们如何使用事务对其进行测试?

非常感谢任何帮助,

我是

4

1 回答 1

1

使用 MarkLogic,整个 XQuery 更新通常就像单个事务一样。当mut:release向事务的堆栈添加更新时,查询的其余部分在提交之前不会看到该更新。从查询的角度来看,这通常发生整个查询完成之后,并且对查询不可见。

关于http://docs.marklogic.com/xdmp:rollback的作用,文档有一些有用的补充:

当事务回滚时,当前语句立即终止,事务中任何语句所做的更新都被丢弃,事务终止。

所以不是变量被拆除:而是你的程序结束了。

我认为http://docs.marklogic.com/guide/app-dev/transactions#id_15746有一个非常接近您的用例的示例:“示例:多语句事务和相同语句隔离”。它演示了如何更新文档xdmp:evalxdmp:invoke在同一查询中查看结果。

测试它以查看它是否有效,然后将 替换xdmp:commitxdmp:rollback. 对我来说,这个例子仍然有效。开始用你的单元测试逻辑替换其余的逻辑,你应该在你的路上。

于 2012-12-24T17:59:22.483 回答