运行事务

使用事务将相关查询组合在一起,这些查询协同工作以实现单个逻辑数据库操作。由于 Neo4j 符合 ACID,事务中的查询将要么作为一个整体执行,要么根本不执行:您不能让事务的一部分成功而另一部分失败。

显式事务仅在 Aura 和单实例自管服务器上可用。如果您正在运行自管集群,则需要实现自己的方法,以便属于同一事务的请求被路由到同一集群成员。
包含 CALL {} IN TRANSACTIONS 的 Cypher 查询不能在显式事务中执行。请改为通过 隐式事务 提交这些查询。

创建事务

要打开一个新的(显式)事务,请向以下端点提交 POST 请求

http://<host>:<port>/db/<databaseName>/query/v2/tx
  • <host> 是 Neo4j 实例所在的位置(例如:localhost, xxx.databases.neo4j.io),

  • <port> 是 Neo4j HTTP 服务器监听的端口(可选;默认 7474),

  • <databaseName> 是您要查询的数据库(例如:neo4j)。

每个请求都必须包含 Authorization 请求头,有关更多信息,请参阅 授权请求

请求体可以

  • 包含一个带有要执行的 Cypher 查询的 statement 对象

  • 包含一个空的 statement 对象

  • 完全为空。

后两种选项是为了避免事务超时。
服务器响应新事务的位置。

请求示例

POST http://localhost:7474/db/neo4j/query/v2/tx
Accept: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
Content-Type: application/json
{
  "statement": "MERGE (n:Person {name: $name, age: $age}) RETURN n AS alice",
  "parameters": {
    "name": "Alice",
    "age": 42
  }
}

响应示例

202: Accepted  (1)
Content-Type: application/json
neo4j-cluster-affinity: MTAuOC41Ljc6MTc0NzQ=  (2)
{
  "data": {
    "fields": [  (3)
      "alice"
    ],
    "values": [  (4)
      [
        {
          "elementId": "4:ff04df25-ff2b-4b55-98f8-6888297b025e:0",  (5)
          "labels": [
            "Person"
          ],
          "properties": {
            "name": "Alice",
            "age": 42
          }
        }
      ]
    ]
  },
  "bookmarks": [  (6)
    "FB:kcwQ/wTfJf8rS1WY+GiIKXsCXgmQ"
  ],
  "transaction": {  (7)
    "id": "lyU",
    "expires": "2024-10-22T15:48:29Z"
  }
}
1 由于服务器在发送 HTTP 状态码时不知道请求是否成功,因此所有 API 请求都返回 202 状态码,无论语句是否成功执行。唯一的例外是身份验证错误,它会返回 401 状态码。
2 neo4j-cluster-affinity 请求头仅从 Aura 实例返回,并标识处理事务的集群成员。它必须作为请求头包含在所有后续请求中,包括提交/回滚请求。
3 查询结果键。
4 查询返回的每个结果的查询结果值。每个单独的结果值与 fields 的顺序相同。
有关值可能采用的格式的更多信息,请参阅 结果格式与数据类型
5 数据库中的实体 ID。请谨慎使用 elementId,因为不保证在单个事务范围之外的 ID 值和元素之间的映射。例如,使用 elementId 在不同事务之间 MATCH 元素是有风险的。
6 书签用于强制事务的排序。
有关更多信息,请参阅 协调事务并强制因果一致性
7 事务元数据。将 ID 用于后续请求 URI。

执行查询

事务打开后,您可以通过向以下端点发送更多 POST 请求来向其提交查询

http://<host>:<port>/db/<databaseName>/query/v2/tx/<transactionID>

您可以在第一次请求结果的 transaction.id 键下找到事务 ID。

如果使用 Aura 实例,请求必须包含 neo4j-cluster-affinity 请求头,重播服务器在事务打开时发送的值。

请求示例

POST http://localhost:7474/db/neo4j/query/v2/tx/lyU
Accept: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
Content-Type: application/json
neo4j-cluster-affinity: MTAuOC41Ljc6MTc0NzQ=
{
  "statement": "MERGE (n:Person {name: $name, age: $age}) RETURN n AS bob",
  "parameters": {
    "name": "Bob",
    "age": 43
  }
}

响应示例

202: Accepted
Content-Type: application/json
neo4j-cluster-affinity: MTAuOC41Ljc6MTc0NzQ=
{
  "data": {
    "fields": [
      "bob"
    ],
    "values": [
      [
        {
          "elementId": "4:ff04df25-ff2b-4b55-98f8-6888297b034e:0",
          "labels": [
            "Person"
          ],
          "properties": {
            "name": "Bob",
            "age": 43
          }
        }
      ]
    ]
  },
  "bookmarks": [
    "FB:kcwQ/wTfJf8rS1WY+GiIKXsCXgmQ"
  ],
  "transaction": {
    "id": "lyU",
    "expires": "2024-10-22T15:48:29Z"
  }
}

事务过期和保持活跃

事务在一段时间不活动后会自动过期,然后被回滚。默认超时时间为 60 秒,但您可以在服务器配置中设置不同的值(server.queryapi.transaction_idle_timeout)。

事务过期时间在每个响应中报告,位于 transaction 键下。要在不提交新查询的情况下保持事务活跃,您可以向事务 URI 提交一个空语句。

尝试向已过期事务提交查询会导致错误

{
  "errors": [ {
    "code": "Neo.ClientError.Request.Invalid",
    "message": "Transaction with Id: \"lyU\" was not found. It may have timed out and therefore rolled back or the routing header 'neo4j-cluster-affinity' was not provided."
  } ]
}
如果响应不包含 transaction 键,则相应的事务已关闭。这发生在大多数错误发生之后。

提交事务

要提交事务,请向以下端点发送 POST 请求

http://<host>:<port>/db/<databaseName>/query/v2/tx/<transactionID>/commit

提交事务会导致其更改在数据库上永久生效。

请求可以选择包含一个最终的 statement 对象,该对象在关闭事务之前执行。

请求示例

POST http://localhost:7474/db/neo4j/query/v2/tx/lyU/commit
Accept: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
Content-Type: application/json
neo4j-cluster-affinity: MTAuOC41Ljc6MTc0NzQ=

响应示例

202: Accepted
Content-Type: application/json
neo4j-cluster-affinity: MTAuOC41Ljc6MTc0NzQ=

回滚事务

要回滚事务,请向以下端点提交 DELETE 请求

http://localhost:7474/db/neo4j/tx/query/v2/<transactionID>

当事务回滚时,数据库状态会恢复到事务打开之前的状态。您的查询将对数据库进行的所有更改都将被丢弃。

请求示例

DELETE http://localhost:7474/db/neo4j/query/v2/tx/lyU
Accept: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
neo4j-cluster-affinity: MTAuOC41Ljc6MTc0NzQ=

响应示例

202: Accepted
Content-Type: application/json
neo4j-cluster-affinity: MTAuOC41Ljc6MTc0NzQ=

打开事务时的身份验证失败

对已打开事务的请求中的身份验证错误(Neo.ClientError.Security.Unauthorized)会导致回滚。但事务仍然保持打开状态。

术语表

Aura

Aura 是 Neo4j 的完全托管云服务。它提供免费和付费计划。

Cypher

Cypher 是 Neo4j 的图查询语言,允许您从数据库中检索数据。它类似于 SQL,但适用于图。

ACID

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)(ACID)是保证数据库事务可靠处理的属性。符合 ACID 的 DBMS 确保数据库中的数据即使在发生故障时也能保持准确和一致。

因果一致性

如果读写查询在集群的每个成员中以相同的顺序可见,则数据库是因果一致的。这比最终一致性更强。

事务

事务是一个工作单元,它要么整体提交,要么在失败时回滚。例如,银行转账:它涉及多个步骤,但它们必须全部成功或全部恢复,以避免资金从一个账户扣除但未添加到另一个账户的情况。

© . All rights reserved.