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 方式是首选?

4

2 回答 2

2

(根据原文编辑)

根据文档:

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

为了触发交易,您需要明确地这样做

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

db._executeTransaction(description);

例如:

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

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

话虽如此,文档/图形数据库的主要好处是水平扩展、分片和集群能力。如果您绝对需要依赖事务,您可能需要重新考虑为什么要使用基于文档的数据库。最终一致性对于很多用例来说通常已经足够好了,但在其他情况下你绝对需要ACID。博客可能不需要 ACID。

于 2019-02-22T17:44:53.640 回答
2

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

有一些警告要记住:

  • 在集合的更新语句之后,您不能在任何进一步的更新或读取语句中使用此特定集合
  • 如果您启用中间提交,则更新将不再是原子的
于 2019-02-25T12:32:13.627 回答