MarkLogic中的JavaScript调用事务

MarkLogic中的JavaScript调用事务,javascript,transactions,marklogic,invoke,Javascript,Transactions,Marklogic,Invoke,我有xml文档: <product-inventory> <product> <name>shoe</name> <price>100</price> <date>2020-05-31</date> </product> <product> <name>dress</name> <price>

我有xml文档:

<product-inventory>
  <product>
    <name>shoe</name>
    <price>100</price>
    <date>2020-05-31</date>
  </product>
  <product>
   <name>dress</name>
    <price>100</price>
    <date>2020-06-01</date>
  </product>
  <product>
   <name>dress</name>
    <price>200</price>
    <date>2020-06-02</date>
  </product>
</product-inventory>

有人能解释一下为什么当程序到达
retrieveDoc()
时我仍然看到旧文档吗?

我认为您需要将
retrieveDoc()
包装到另一个
xdmp.invokeFunction
中才能看到更新的文档

xdmp.invokeFunction(()=>{
返回retrieveDoc()
})

有趣的一点。我试图找出如何将这些部分组合在一起,以尽量减少过度调用/评估。也就是说,可以想象,它们是不同的txn类型。非常感谢。原因是主循环在查询模式下运行,这会导致任何读取都发生在代码开始的时间戳上,从而导致无法看到正在进行的更改。此外,提交是以延迟方式发生的,因此即使在更新模式下,您仍然看不到更新。在另一个调用中包装检索将创建一个新的上下文,并使用更晚的时间戳运行,从而导致看到更早的更改。如果不包装,也会有死锁的风险,例如,当您在更新文档之前查找文档时。主循环将在文档上创建一个读锁,第一次调用将无法更新,直到释放读锁,这只在代码完成时发生。结果将是超时,并且不会写入更新。
<product-inventory>
  <product>
    <name>shoe</name>
    <price>100</price>
    <date>2020-05-31</date>
  </product>
  <product>
   <name>dress</name>
    <price>700</price>
    <date>2020-06-01</date>
    <audit>
      <modifiedBy>admin</modifiedBy>
      <modifiedDate>2020-06-02T16:12:14.9664853-04:00</modifiedDate>
    </audit>
  </product>
  <product>
   <name>dress</name>
    <price>200</price>
    <date>2020-06-02</date>
  </product>
</product-inventory>
function  updateDoc() {
**************
   xdmp.nodeReplace(
**************
};

function auditHistory() {
*********************
   xdmp.nodeInsertAfter(
*********************
};

function retrieveDoc() {
  return fn.collection('product')
};

xdmp.invokeFunction(function(){
  declareUpdate();
  updateDoc();
  auditHistory();
}),
retrieveDoc();