我试图在自定义API中实现类似于MarkLogic REST API的/transactions
端点的功能。但是,看起来只有一些所需的功能才能在XQuery中实现。
提供xdmp:transaction-commit()
和xdmp:transaction-rollback()
来远程管理现有的开放事务,但是没有相应的XQuery函数来打开新事务或向其附加新语句。
我在REST API实现中窥探它是如何在那里完成的,并且他们使用未记录的函数xdmp:transaction-create()
和不推荐使用的选项<transaction-mode>update</transaction-mode>
(我使用<update>
和<commit>
选项进行测试,这会使服务器发生错误!)。
然后通过<set-transaction>
将语句附加到XML重写器中的事务,该事务不对应于XQuery函数,但我认为它与使用eval
或invoke
和<transaction-id>
选项(也已弃用)相同。
使用这些方法的简单概念证明似乎工作正常,但我不确定如果不使用未记录和弃用的功能,我是否错过了这样做的方法。也许没关系,因为REST API是如何做到的?提供函数来提交和回滚没有批准的创建或更新方法的远程事务似乎很奇怪。
是的,遗憾的是,实现这一目标并创建自己的API的唯一方法是使用未记录的函数。
使用Multi-statement Transactions查看XQRS中的transaction.xq,这可能会给你一个更好的主意。
至于设置单个语句是只读还是更新,可以使用%xdmp:update批注。