运行事务
| 显式事务仅在 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 https://: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 相同。有关值格式的更多信息,请参阅 纯 JSON 和 类型化 JSON。 |
| 5 | 数据库内的实体 ID。请谨慎使用 elementId,因为不保证 ID 值与单个事务范围之外的元素之间的映射关系。例如,使用 elementId 在不同事务之间 MATCH 元素是有风险的。 |
| 6 | 书签 (Bookmarks) 用于强制执行事务的顺序。 有关更多信息,请参阅 协调事务并强制因果一致性。 |
| 7 | 事务元数据。请将该 ID 用于后续请求的 URI。 |
执行查询
事务打开后,您可以通过向以下端点发送更多 POST 请求来向其提交查询
http://<host>:<port>/db/<databaseName>/query/v2/tx/<transactionID>
您可以在首次请求结果的 transaction.id 键下找到事务 ID。
如果使用 Aura 实例,请求必须包含 neo4j-cluster-affinity 请求头,并重发服务器在打开事务时发送的值。
请求示例
POST https://: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
{
"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 https://: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
{
"bookmarks": [
"FB:kcwQrwI41VhBRoiBLch+ikTikQKQ"
]
}
回滚事务
要回滚事务,请向以下端点提交 DELETE 请求
https://:7474/db/neo4j/tx/query/v2/<transactionID>
当事务回滚时,数据库的状态将恢复到事务打开之前的状态。因此,您的查询对数据库所做的所有更改都将被丢弃。
请求示例
DELETE https://:7474/db/neo4j/query/v2/tx/lyU
Accept: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
neo4j-cluster-affinity: MTAuOC41Ljc6MTc0NzQ=
示例响应
202: Accepted
Content-Type: application/json
打开事务时的身份验证失败
对打开的事务的请求中出现身份验证错误 (Neo.ClientError.Security.Unauthorized) 会导致回滚。但事务本身仍然保持打开状态。
术语表
- Aura
-
Aura 是 Neo4j 的全托管云服务。它提供免费和付费计划。
- Cypher
-
Cypher 是 Neo4j 的图查询语言,允许您从数据库中检索数据。它类似于 SQL,但专门用于图数据。
- ACID
-
原子性 (Atomicity)、一致性 (Consistency)、隔离性 (Isolation)、持久性 (Durability) (ACID) 是保证数据库事务可靠处理的属性。符合 ACID 的 DBMS 确保即使发生故障,数据库中的数据也能保持准确和一致。
- 因果一致性
-
如果集群的每个成员都以相同的顺序看到读写查询,则该数据库具有因果一致性。这比最终一致性更强。
- 事务
-
事务是一个工作单元,要么被提交,要么在失败时被回滚。例如银行转账:它涉及多个步骤,但它们必须全部成功或全部撤销,以避免钱从一个账户扣除却未存入另一个账户的情况。