我对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方式?
(原件编辑)
根据文件:
每个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。
单个服务器环境中的AQL以ACID方式执行。这是自动在单个交易中,而不需要单独的_executeTransaction
。因此,您可以使用上述AQL语句在单个AQL语句中更新两个集合。
需要记住一些警告: