我对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方法?
答案 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语句中更新两个集合。
请记住一些注意事项: