【问题标题】:Creating remote transactions and attaching statements in MarkLogic在 MarkLogic 中创建远程事务并附加语句
【发布时间】:2023-03-27 17:14:01
【问题描述】:

我正在尝试在自定义 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 函数不对应,但我认为它与使用 evalinvoke<transaction-id> 相同选项(也已弃用)。

使用这些方法的简单概念证明似乎可以正常工作,但我不确定我是否错过了在不使用未记录和已弃用功能的情况下执行此操作的方法。也许没关系,因为 REST API 就是这样做的?提供提交和回滚远程事务的函数似乎很奇怪,而这些事务没有经过批准的创建或更新方式。

【问题讨论】:

    标签: transactions xquery marklogic marklogic-9


    【解决方案1】:

    是的,不幸的是,实现这一点并创建自己的 API 的唯一方法是使用未记录的函数。

    transaction.xq 看看XQRS 中的Multi-statement Transactions,这可能会给你一个更好的主意。

    至于设置单个语句是只读还是更新,可以使用 %xdmp:update 注解。

    【讨论】:

    • 我注意到这仅使用事务 ID 管理事务,始终默认为与请求关联的主机 ID。是否担心如果对事务的后续请求不粘在同一个主机上,它可能找不到该事务?
    • 可能是的,在这种情况下 - 可以修改代码以首先找到持有交易的主机。但是,保持简单 - 如果您要进行多语句事务,最好在该事务期间处理同一主机,特别是因为 HTTP 上的设计使用会话 Cookie 来跟踪事务无论如何,它都与特定主机相关联。同样重要的是,如果您发现 XQRS 的错误并在 GitHub 上创建问题 - 它将被修复。
    猜你喜欢
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2014-09-24
    相关资源
    最近更新 更多