具有来自两个集合的更新文档的AQL查询是否作为事务运行?

问题描述 投票:1回答:2

我对arangodb中的事务有疑问,如果我在AQL查询下运行,它会作为一个事务执行还是会被分成两个事务?我的后端是php:

LET r1 = (FOR u IN Users UPDATE u WITH { status: "inactive" } IN Users)
LET r2 = (FOR b IN Blogs UPDATE b WITH { status: "inactive" } IN Blogs)
RETURN true

现在我使用事务作为arangodb文档建议(使用javascript代码),但如果使用AQL查询是可能的,我宁愿从我的PHP代码中删除js代码!

如果可能,您是否建议使用此解决方案进行交易或使用js方式?

transactions arangodb aql arangodb-php
2个回答
1
投票

(原件编辑)

根据文件:

每个UPDATE操作仅限于一个集合,集合名称不能是动态的。每个AQL查询只允许每个集合使用一个UPDATE语句,并且不能通过遍历操作或可以读取文档的AQL函数访问相同集合的读取或写入操作。

为了trigger a transaction you need to do so explicitly

ArangoDB中没有单独的BEGIN,COMMIT或ROLLBACK事务命令。相反,通过向db._executeTransaction JavaScript函数提供事务描述来启动ArangoDB中的事务:

db._executeTransaction(description);

例如:

db._executeTransaction({
  collections: {
    write: [ "users", "logins" ],
    read: [ "recommendations" ]
  }
});

因此,要回答这个问题,您需要使用客户端库来触发事务,因为它不会自动发生。

话虽这么说,文档/图形数据库的主要好处是水平缩放,分片和群集功能。如果您绝对需要依赖事务,则可能需要重新考虑使用基于文档的数据库的原因。 Eventual Consistency通常对很多用例都足够好,但在其他情况下你绝对需要ACID。博客可能不需要ACID。


1
投票

单个服务器环境中的AQL以ACID方式执行。这是自动在单个交易中,而不需要单独的_executeTransaction。因此,您可以使用上述AQL语句在单个AQL语句中更新两个集合。

需要记住一些警告:

  • 在集合的update语句之后,您不能在任何进一步的更新或读取语句中使用此特定集合
  • 如果启用中间提交,则更新将不再是原子的
© www.soinside.com 2019 - 2024. All rights reserved.