MarkLogic中的JavaScript调用事务
我有xml文档: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>
<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();