生成的函数等待生成的事务被提交?

时间:2018-07-13 23:50:39

标签: marklogic race-condition spawn

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

生成的函数看不到生成查询中所做的更改。

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

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

所以我得到两个相关的问题:

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

  • 2)可以生成一个函数,但只有在事务成功(并且如果失败,则不将其放置在任务服务器上)的情况下,才将其实际放置在任务服务器队列上,从而产生一种回滚)?

我现在可以想到的一个解决方案是使用提交后触发器,但这听起来有点令人费解,我希望在生成函数时可以有一个简单的选择。

1 个答案:

答案 0 :(得分:2)

  

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

不能。正如您正确指出的那样,直到启动衍生交易之后,衍生交易才会完成。我能想到的唯一方法是在产生下一个任务之前,在一个单独的隔离事务中逃避集合更新代码。

  

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

我不知道。最佳实践是使生成任务成为您最后要做的事情,如果在失败之前就发现失败,请在生成后续任务之前尽早完成任务。

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