1

我在代码下方运行并期望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();
4

2 回答 2

1

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

于 2019-01-09T22:48:39.687 回答
1

fn:current-dateTime()确定性的,并且将始终在同一事务中返回一致的答案。

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

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

<tstmp>{fn:current-dateTime() + xdmp:elapsed-time()}</tstmp>
于 2019-01-10T00:51:15.023 回答