【问题标题】:MarkLogic - Sequential processing of XQuery statementsMarkLogic - XQuery 语句的顺序处理
【发布时间】:2019-01-09 22:33:31
【问题描述】:

我在代码下方运行,并期望 insert-after 函数在 insert-before 函数之后执行(至少有 2000 毫秒的间隙),因为我的理解是 XQuery 将按顺序执行语句。但是,运行代码后,我看到这两个函数创建的两个文档(/content/testbefore.xml/content/testafter.xml)都有准确的时间戳与毫秒匹配的值。

如何让语句按顺序执行?

xquery version "1.0-ml";

declare function local:insert-before()
  {
  let $contents :=
    <book>
      <bookTitle>All About George</bookTitle>
      <tstmp>{fn:current-dateTime()}</tstmp>
      <chapter1>
        <chapterTitle>Curious George</chapterTitle>
      </chapter1>
   </book>
  return xdmp:document-insert("/content/testbefore.xml", $contents)
};

declare function local:insert-after()
{
let $contents :=
  <after>
    <bookTitle>All About George</bookTitle>
    <tstmp>{fn:current-dateTime()}</tstmp>
    <chapter1>
      <chapterTitle>Curious George</chapterTitle>
    </chapter1>
 </after>
 return xdmp:document-insert("/content/testafter.xml", $contents)
};

local:insert-before(),
xdmp:commit(),
xdmp:sleep(2000),
local:insert-after();

【问题讨论】:

    标签: marklogic marklogic-9 marklogic-dhf


    【解决方案1】:

    fn:current-dateTime()deterministic,并且总是会在同一事务中返回一致的答案。

    [定义]如果显式和隐式参数相同,则保证在单个·执行范围·内重复调用产生·相同·结果的函数称为确定性。

    您可以使用xdmp:elapsed-time(),它将返回自开始处理查询以来经过时间的xs:dayTimeDuration,并将其添加到fn:currentDateTime() 值中:

    <tstmp>{fn:current-dateTime() + xdmp:elapsed-time()}</tstmp>
    

    【讨论】:

      【解决方案2】:

      语句按该顺序执行,但所有内容都在同一个快照中提交到数据库。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-31
        • 2017-10-26
        • 2012-07-24
        相关资源
        最近更新 更多