Marklogic 生成函数是否等待提交生成事务?

Marklogic 生成函数是否等待提交生成事务?,marklogic,race-condition,spawn,Marklogic,Race Condition,Spawn,我有一个查询,对数据库做了一些更改(更改了几个文档上的一些集合),然后生成了一个函数 派生函数看不到在派生查询中所做的更改 如果生成的函数生成自身,那么它在第二次运行时确实会看到更改(然后不再生成自身) 我敢打赌,任务服务器会在MVCC机制为事务结束选择自己的时间戳之前立即选择生成的函数 所以我有两个相关的问题: 1) 如何确保生成的函数等待生成事务的结束 2) 是否有可能生成一个函数,但只有在事务成功时才将其实际放入任务服务器队列(如果事务失败,则不会将其放入任务服务器,从而导致某种回滚)

我有一个查询,对数据库做了一些更改(更改了几个文档上的一些集合),然后生成了一个函数

派生函数看不到在派生查询中所做的更改

如果生成的函数生成自身,那么它在第二次运行时确实会看到更改(然后不再生成自身)

我敢打赌,任务服务器会在MVCC机制为事务结束选择自己的时间戳之前立即选择生成的函数

所以我有两个相关的问题:

  • 1) 如何确保生成的函数等待生成事务的结束

  • 2) 是否有可能生成一个函数,但只有在事务成功时才将其实际放入任务服务器队列(如果事务失败,则不会将其放入任务服务器,从而导致某种回滚)

我现在能想到的一个解决方案是使用post-commit触发器,但这听起来有点复杂,我希望在生成函数时有一个简单的选项可以做到这一点

1) 如何确保生成的函数等待生成事务的结束

你不能。正如您正确指出的,生成事务只有在生成的事务启动之后才能完成。我能想到的唯一方法是,在生成下一个任务之前,在一个独立的事务中评估集合更新代码

2) 是否有可能生成一个函数,但只有在事务成功时才将其实际放入任务服务器队列(如果事务失败,则不会将其放入任务服务器,从而导致某种回滚)

据我所知没有。最佳实践是,如果在生成后续任务之前,您在早期发现了一个失败,那么将生成任务作为最后一件事


这里的第三个选项是查看某种外部编排来运行这些查询。例如,您可以为步骤1发出查询,为其返回URI,然后为步骤2发出查询。我更喜欢这种方法,这样在生成太多任务并降低集群速度的情况下,您可以更轻松地停止代码。繁重的产卵任务让我非常紧张。这还可以更容易地跟踪流程中哪个步骤失败。

谢谢你,Rob!使用
xdmp:invoke函数
听起来确实很吸引人。不幸的是,由于该文档是在我们要删除的同一集合上使用搜索找到的,因此会引发死锁。我认为不可能防止这种情况发生。基本上,执行cts:uri(coll)[1],…,remove(coll)。我认为没有一种方法可以在
调用函数
中包装
remove(coll)
,而不引起死锁。我的错。实际上,我能够以一种方式重塑代码,使搜索和删除集合出现在同一个事务中(只需扩大调用函数的范围,并确保生成被进一步移动)。因此,现在,任务在更新提交后正确运行(不需要仅针对更新提交后触发器)。谢谢是的,完全同意你的最后一段,我总是倾向于外部编排,甚至最好是从MarkLogic之外,而不是多语句查询。但它不适用于这一特殊情况。再次感谢。@FlorentGeorges很高兴它成功了!希望一切顺利,澄清一下这项技术。强制查询以只读(非更新)模式开始(可以使用特定于ML的xquery prolog作为事务模式)。根据需要,在读取或更新模式下将函数或模块生成为子事务,然后等待返回,然后继续执行可能自动将事务升级为更新模式的任何表达式。这可以在一个顶级事务中完成。