协调事务并强制因果一致性

事务型 HTTP API 已被弃用,现已由 HTTP 查询 API 取代。请参阅 查询 API → 协调事务并强制因果一致性 了解如何在查询 API 中使用书签的详细信息。

在使用集群时,书签 允许你串联事务并强制 因果一致性。书签是一种表示数据库某个状态的令牌。通过在查询中携带一个或多个书签,服务器将确保在对应状态被建立之前,查询不会被执行。

在提交事务的请求(即访问 tx/committx/<n>/commit 端点)上,响应会包含一个 lastBookmarks 键,其值是一个已编码书签的数组,代表事务已提交更改的状态。

请求示例

POST https://:7474/db/neo4j/tx/commit
Accept: application/json;charset=UTF-8
Content-Type: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
{
  "statements": [
    {
      "statement": "MERGE (p1:Person {name: $name}) MERGE (p2:Person {name: $otherName}) RETURN p1.name, p2.name",
      "parameters": {
        "name": "Alice",
        "otherName": "Bob"
      }
    }
  ]
}

示例响应

200: OK
Content-Type: application/json;charset=utf-8
{
  "results": [ {
    "columns": [ "p1.name", "p2.name" ],
    "data": [ {
      "row": [ "Alice", "Bob" ],
      "meta": [ null, null ]
    } ]
  } ],
  "errors": [],
  "lastBookmarks": [
    "FB:kcwQt8DpQx5zR0uN3Oj/OudM3QaQ"
  ]
}

如果希望因果地将这些事务串联起来,你可以在后续事务的 Bookmarks 头中使用响应返回的书签。该头部应包含书签字符串列表。服务器会等到追赶上书签中封装的更改后,才执行提交的事务。

在下面的示例中,服务器只有在记录了书签 FB:kcwQt8DpQx5zR0uN3Oj/OudM3QaQFB:kcwQy9mp3ioyRom386bZDRRcuCiQ 所关联的更改后,才会执行事务。

请求示例

POST https://:7474/db/neo4j/tx/commit
Accept: application/json;charset=UTF-8
Content-Type: application/json
Authorization: Basic bmVvNGo6dmVyeXNlY3JldA==
Bookmarks: ["FB:kcwQt8DpQx5zR0uN3Oj/OudM3QaQ", "FB:kcwQy9mp3ioyRom386bZDRRcuCiQ"]
{
  "statements": [
    {
      "statement": "MATCH (p1:Person {name: $source}) MATCH (p2:Person {name: $end}) MERGE (p1)-[:LIKES]->(p2)",
      "parameters": {
        "source": "Alice",
        "end": "Bob"
      }
    }
  ]
}

服务器返回的书签不应由客户端解析或修改,只需原样插入到 Bookmarks 头部即可。

术语表

Aura

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

Cypher

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

ACID

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

因果一致性

如果集群的每个成员都以相同的顺序看到读写查询,则该数据库具有因果一致性。这比最终一致性更强。

事务

事务是一个工作单元,要么被提交,要么在失败时被回滚。例如银行转账:它涉及多个步骤,但它们必须全部成功或全部撤销,以避免钱从一个账户扣除却未存入另一个账户的情况。