事务

Neo
Neo
2022-03-12 / 0 评论 / 66 阅读

本节内容源自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 事务中组合任何这些工作负载。