来自两个集合的带有updatedocuments的AQL查询是否作为事务运行?

时间:2019-02-22 10:38:00

标签: transactions arangodb aql arangodb-php

我对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方法?

2 个答案:

答案 0 :(得分:1)

(由原始版本编辑)

根据文档:

  

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

为了trigger a transaction you need to do so explicitly

  

没有单独的BEGIN,COMMIT或ROLLBACK事务命令   在ArangoDB中。相反,ArangoDB中的事务由   向交易者提供交易说明   db._executeTransaction JavaScript函数:

db._executeTransaction(description);

例如:

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

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

话虽如此,文档/图形数据库的主要优点是水平缩放,分片和群集功能。如果您绝对需要依赖事务,则可能需要重新考虑为什么要使用基于文档的数据库。 Eventual Consistency通常足以应付许多用例,但在其他情况下,您绝对需要ACID。博客大概不需要ACID。

答案 1 :(得分:1)

单个服务器环境中的AQL以ACID方式执行。这是自动在单个事务中完成的,无需进一步使用单独的_executeTransaction。因此,您可以使用上述AQL语句在一个AQL语句中更新两个集合。

请记住一些注意事项:

  • 在集合的更新语句之后,您不能在任何进一步的更新或读取语句中使用该特定集合
  • 如果启用中间提交,则更新将不再是原子性的