考虑这段代码:
xquery version "1.0-ml";
let $_ := xdmp:document-insert("/private/test.xml", <t13 /> )
let $doc := fn:doc( "/private/test.xml" )
return $doc
文件 /private/test.xml 在执行前不存在。我希望这段代码返回插入的文档,但什么也不返回。
我认为这是因为在进行 fn:doc() 调用时文档尚未提交。该文档表明更新语句中的更新不可见,因此我认为这是预期的行为,尽管这是违反直觉的行为。
但是,这种奇怪的行为需要在将提交作为事务中的最后一条语句之前在内存中计划和进行所有更新,本质上强制所有更新功能以协调的方式工作。当然,这在设计模块化软件时会产生问题,因为它在执行功能之间强制执行强相互依赖性。
我找到的解决方法如下:
let $_ := xdmp:invoke-function( function() { xdmp:document-insert("/private/test.xml", <t13 /> ) } )
let $doc := xdmp:invoke-function( function() { fn:doc( "/private/test.xml" ) } )
return $doc
由于每个 invoke-function() 调用都在其自己的事务中执行,因此这是可行的。这对于我当前的用例来说还可以,但它肯定会改变应用程序的行为,并且可能会破坏许多其他情况的一致性要求。
我的问题:有没有更好的解决方法
谢谢你,K。