Marklogic 生成函数是否等待提交生成事务?
我有一个查询,对数据库做了一些更改(更改了几个文档上的一些集合),然后生成了一个函数 派生函数看不到在派生查询中所做的更改 如果生成的函数生成自身,那么它在第二次运行时确实会看到更改(然后不再生成自身) 我敢打赌,任务服务器会在MVCC机制为事务结束选择自己的时间戳之前立即选择生成的函数 所以我有两个相关的问题:Marklogic 生成函数是否等待提交生成事务?,marklogic,race-condition,spawn,Marklogic,Race Condition,Spawn,我有一个查询,对数据库做了一些更改(更改了几个文档上的一些集合),然后生成了一个函数 派生函数看不到在派生查询中所做的更改 如果生成的函数生成自身,那么它在第二次运行时确实会看到更改(然后不再生成自身) 我敢打赌,任务服务器会在MVCC机制为事务结束选择自己的时间戳之前立即选择生成的函数 所以我有两个相关的问题: 1) 如何确保生成的函数等待生成事务的结束 2) 是否有可能生成一个函数,但只有在事务成功时才将其实际放入任务服务器队列(如果事务失败,则不会将其放入任务服务器,从而导致某种回滚)
- 1) 如何确保生成的函数等待生成事务的结束
- 2) 是否有可能生成一个函数,但只有在事务成功时才将其实际放入任务服务器队列(如果事务失败,则不会将其放入任务服务器,从而导致某种回滚)
这里的第三个选项是查看某种外部编排来运行这些查询。例如,您可以为步骤1发出查询,为其返回URI,然后为步骤2发出查询。我更喜欢这种方法,这样在生成太多任务并降低集群速度的情况下,您可以更轻松地停止代码。繁重的产卵任务让我非常紧张。这还可以更容易地跟踪流程中哪个步骤失败。谢谢你,Rob!使用
xdmp:invoke函数
听起来确实很吸引人。不幸的是,由于该文档是在我们要删除的同一集合上使用搜索找到的,因此会引发死锁。我认为不可能防止这种情况发生。基本上,执行cts:uri(coll)[1],…,remove(coll)。我认为没有一种方法可以在调用函数中包装remove(coll)
,而不引起死锁。我的错。实际上,我能够以一种方式重塑代码,使搜索和删除集合出现在同一个事务中(只需扩大调用函数的范围,并确保生成被进一步移动)。因此,现在,任务在更新提交后正确运行(不需要仅针对更新提交后触发器)。谢谢是的,完全同意你的最后一段,我总是倾向于外部编排,甚至最好是从MarkLogic之外,而不是多语句查询。但它不适用于这一特殊情况。再次感谢。@FlorentGeorges很高兴它成功了!希望一切顺利,澄清一下这项技术。强制查询以只读(非更新)模式开始(可以使用特定于ML的xquery prolog作为事务模式)。根据需要,在读取或更新模式下将函数或模块生成为子事务,然后等待返回,然后继续执行可能自动将事务升级为更新模式的任何表达式。这可以在一个顶级事务中完成。