在marklogic 9中,如何使更新在同一事务中可见?

在marklogic 9中,如何使更新在同一事务中可见?,marklogic,marklogic-9,Marklogic,Marklogic 9,在MarkLogic9中,我用xquery编写了一个资源服务扩展。它是“删除”端点,因此事务模式为“更新”。我做了一些类似的事情: (: search for objects that have /a/id = $theId :) let $objs := cts:search(fn:doc(), cts:path-range-query('/a/id', $theId) (: log the number of results :) let $_ := xdmp:log(fn:count($o

在MarkLogic9中,我用xquery编写了一个资源服务扩展。它是“删除”端点,因此事务模式为“更新”。我做了一些类似的事情:

(: search for objects that have /a/id = $theId :)
let $objs := cts:search(fn:doc(), cts:path-range-query('/a/id', $theId)
(: log the number of results :)
let $_ := xdmp:log(fn:count($objs))

(: for each of the objects, remove the /a/id node :)
let $_ := for ($obj in $objs) xdmp:node-delete($obj/a/id)

(: search for objects that have /a/id = $theId :)
let $objs2 := cts:search(fn:doc(), cts:path-range-query('/a/id', $theId)
(: log the number of results :)
let $_ := xdmp:log(fn:count($objs2))
我的第一个期望是记录的值会有所不同:第一个是搜索结果的数量,第二个总是零,因为我从每个结果中删除了“/a/id”节点。但是,两个记录的值始终相同。i、 e.事务中所做的更改在扩展中不可见

我读到,
更新在updateing语句中不可见,因此我尝试使资源服务扩展的行为类似于多语句更新,但没有运气。在进行第二次搜索之前,我还尝试显式调用
let$\uxdmp:=xdmp:commit()
,但同样没有成功


在xquery资源服务扩展中是否可能有我想要的行为?

MarkLogic是完全酸性的,因此您已正确标识,在更新事务完成之前,不会在数据库中更新文档。因此,在运行第二个cts:search调用时,您还不会看到结果中反映的更新文档,因为更新事务尚未完成

我的建议通常是引导人们不要试图在单个事务或REST扩展中大肆渲染,而是在有意义的地方将事情分解。我建议您使用一个REST扩展来计数或读取数据,使用一个REST扩展来执行节点删除更新。很可能您甚至可以使用/v1/search来代替编写扩展来计算文档


如果您利用诸如xdmp:eval或xdmp:invoke这样的函数来实现这一点,那么您可以在一个REST扩展中运行多个事务。然而,我发现这样设计通常会使代码更难维护和调试。不必要地使用这些函数也可能存在性能缺陷。

MarkLogic是完全酸性的,因此您已正确标识,在更新事务完成之前,不会在数据库中更新文档。因此,在运行第二个cts:search调用时,您还不会看到结果中反映的更新文档,因为更新事务尚未完成

我的建议通常是引导人们不要试图在单个事务或REST扩展中大肆渲染,而是在有意义的地方将事情分解。我建议您使用一个REST扩展来计数或读取数据,使用一个REST扩展来执行节点删除更新。很可能您甚至可以使用/v1/search来代替编写扩展来计算文档


如果您利用诸如xdmp:eval或xdmp:invoke这样的函数来实现这一点,那么您可以在一个REST扩展中运行多个事务。然而,我发现这样设计通常会使代码更难维护和调试。不必要地使用这些函数也可能存在性能缺陷。

我首先希望在事务本身内部执行的代码能够看到更改,但它仍然会保证ACID。无论如何,我做了一些类似于您建议的事情:使用另一个扩展来更新我需要的数据。但是,为了完整性起见,您能告诉我如何使用xdmp:eval和xdmp:invoke来完成我的要求吗?Rob有用答案的脚注:更改不可见,因为表示数据库更改的调用实际上并没有执行更改。相反,当模块完成时,所有更改将在一次过程中应用。如果您确实需要查看操作的结果,协调模块可以在一个模块上执行xdmp:invoke()以进行更改,在另一个模块上执行xdmp:invoke()以读取更改。但是,最佳实践是直接从进行更改的模块返回有关更改的信息。如果事务失败,模块将无法正常返回。我首先希望事务本身内部执行的代码能够看到更改,但它仍然保证ACID。无论如何,我做了一些类似于您建议的事情:使用另一个扩展来更新我需要的数据。但是,为了完整性起见,您能告诉我如何使用xdmp:eval和xdmp:invoke来完成我的要求吗?Rob有用答案的脚注:更改不可见,因为表示数据库更改的调用实际上并没有执行更改。相反,当模块完成时,所有更改将在一次过程中应用。如果您确实需要查看操作的结果,协调模块可以在一个模块上执行xdmp:invoke()以进行更改,在另一个模块上执行xdmp:invoke()以读取更改。但是,最佳实践是直接从进行更改的模块返回有关更改的信息。如果事务失败,模块将无法正常返回。