本节内容源自Cypher官方手册V4.4版,笔者对其进行学习、翻译、记录。
本节介绍 Cypher 查询如何处理数据库事务。
所有 Cypher 查询都在事务中运行。通过更新查询完成的修改由事务保存在内存中,直到提交,此时更改将持久保存到磁盘并对其他事务可见。如果发生错误 — 无论是在查询评估期间,例如被零除,还是在提交期间,例如违反约束 — 事务会自动回滚,并且不会在图中保留任何更改。
简而言之,更新查询要么完全成功,要么完全不成功。
由于事务在内存中保存更改,因此进行大量更新的查询会使用大量内存。关于 Neo4j 中的内存配置,请参阅Neo4j 操作手册 → 内存配置。
事务可以是显式或隐式的。
-
显式事务:
-
由用户打开。
-
可以按顺序执行多个 Cypher 查询。
-
由用户提交或回滚。
-
-
隐式事务,有时称为自动提交事务或 :auto 事务:
-
是自动打开的。
-
可以执行单个 Cypher 查询。
-
查询成功完成时自动提交。
-
本身启动单独事务的查询,例如使用CALL { … } IN TRANSACTIONS 或者 PERIODIC COMMIT 的查询仅在隐式模式下允许。
有关用于启动和提交事务的 API 示例,请参阅 API 特定文档:
-
有关在 Neo4j 驱动中使用事务的信息,请参阅Neo4j 驱动手册中的会话 API。
-
有关通过 HTTP API 使用事务的信息,请参阅HTTP API 文档 → 使用 HTTP API。
-
有关在嵌入式核心 API 中使用事务的信息,请参阅Java 参考 → 从 Java 执行 Cypher 查询。
在编写过程或使用嵌入的 Neo4j 时,请记住从执行结果返回的所有迭代器都应该完全耗尽或关闭。这样可以确保绑定到它们的资源被正确释放。
DBMS 事务
在连接到 DBMS 时开始事务将启动 DBMS 级别的事务。DBMS 级事务是数据库事务的容器。
当对特定数据库发出第一个查询时,就会启动数据库事务。当 DBMS 级事务被提交或回滚时,在 DBMS 级事务中打开的数据库事务被提交或回滚。
有关如何在一个事务中发出对多个数据库的查询的示例,请参阅Neo4j 驱动手册中的数据库和执行上下文。
DBMS 事务有以下限制:
-
DBMS 事务中只能写入一个数据库
-
Cypher 操作分为以下主要类别:
-
图上的操作。
-
架构命令。
-
管理命令。
-
不可能在单个 DBMS 事务中组合任何这些工作负载。