【问题标题】:MarkLogic rollback multiple statements explicitCommitMarkLogic 回滚多个语句显式提交
【发布时间】:2020-07-22 14:23:26
【问题描述】:
1. declareUpdate({explicitCommit: true});
*************************************************** 
2. let failSafe = [];
3. xdmp.save(ARTIFACT_DIR + 'Geography-1.0-conv.xqy', es.instanceConverterGenerate(geoDesc));
4. failSafe.push("Geography baseline converter module is generated!");
5. xdmp.save(ARTIFACT_DIR + 'GISHealth-1.0-conv.xqy', es.instanceConverterGenerate(gisDesc));
6. failSafe.push("GISHealth baseline converter module is generated!");
7. xdmp.commit(); 
8. failSafe;

L5 预计会失败:XDMP-AS: $model as map:map -- 无效强制:null as map:map。 我想知道如何实现这一点:L3 和 L5 必须同时成功(提交)或失败(回滚)。 L3 不会回滚,即使 L5 失败。

【问题讨论】:

    标签: marklogic commit rollback


    【解决方案1】:

    事务的管理仅用于数据库中的持久性。

    xdmp.save() 保存到本地 E 节点的文件系统中,该文件系统不是事务性的,也不是跨集群共享的。

    相比之下,xdmp.documentInsert() 确实在数据库中插入。数据库操作被缓冲直到主模块完成,此时所有操作默认应用在单个事务中。

    因此,在上面的示例中,不需要显式事务。要么两个文档插入都成功,要么都不成功。

    显式事务对于在同一主模块或不同主模块的不同调用中保持事务打开以进行额外工作很有用。在可能的情况下,应避免显式事务,因为这会带来额外的复杂性、来自客户端的主机亲和性的必要性等等。

    xdmp.documentInsert() 是否可以满足您的要求?例如,通过在内容数据库中插入 XQuery 模块以便稍后下载到另一个系统上的项目目录?

    希望对您有所帮助,

    【讨论】:

    • 将自定义磁盘保存模块,以使摄取数据符合我的实体模型,以实现数据协调。然后可以将其插入到模块数据库中以生成其他工件。很高兴知道并非所有的 xdmp 都可以被视为事务。
    • 将预先定制的模块插入数据库并从数据库中检索模块应该没问题。只是不要使用执行权限保存它们。这样模块将无法执行。是的,据我了解,文件系统在大多数文件系统中都不是事务性的。 MarkLogic 不会尝试在文件系统中模拟事务。
    猜你喜欢
    • 2018-08-18
    • 2020-02-24
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2023-02-26
    • 1970-01-01
    相关资源
    最近更新 更多