【问题标题】:what does transaction mean in reference with neo4j database参考neo4j数据库的事务是什么意思
【发布时间】:2013-08-31 02:09:43
【问题描述】:

我对术语交易有点困惑。 假设在事务 A 中我们有两个命令 C1 和 C2,在事务 B 中也是如此。 现在两个交易同时发生 这些观察结果正确吗?

  1. 事务A C1 和C2 的所有命令都会先执行(假设A 先进入),然后只执行事务B 的命令。

  2. 可以执行事务 A 或 B 的任何命令,但要保证如果任何事务的任何命令失败,则该事务将回滚。

  3. 如果第二种情况为真,则默认情况下在事务中,它不会锁定任何资源,直到其完成

  4. 如果第一种情况为真,则默认情况下事务会锁定资源直到它们完成。

谢谢

阿米特·阿加瓦尔

【问题讨论】:

    标签: transactions neo4j neo4jphp


    【解决方案1】:

    我们需要谈谈 ACID 中的“I”(Neo4j 是 ACID 兼容的),它代表“隔离”。隔离级别告诉你,并发运行的事务看到了多少对方的数据。

    Neo4j 中的默认隔离级别是“已提交读”。这意味着在 B 提交之前,A 不会看到 B 写入的数据。这是通过自动锁定实现的,其工作原理如下:

    Neo4j 在读取节点和关系时对其进行读锁(您可以获得许多读锁),并在修改节点和关系时对其进行写锁。有写锁时不能获得读锁,有写锁时不能获得写锁。事务提交时释放锁。

    但是,在此隔离级别可能会发生一些异常情况,其中之一称为“丢失更新”。

    为了说明,让 c 成为您的计数器值(我知道原子计数器是您最终所追求的)。两个事务都将计数器加 1。

    c=0
    Tx1 reads c=0 (read locks c)
    Tx2 reads c=0 (read locks c)
    Tx1 writes c=1 (write locks c)
    Tx1 commits (unlocks c)
    Tx2 writes c=1 (because it thinks c is still 0, write locks c)
    Tx2 commits (unlocks c)
    

    Tx1 所做的更新丢失。

    为防止这种情况发生,您需要在读取对象的当前值之前,通过写锁定您要显式修改的对象,将隔离级别更改为“可重复读取”。这样,它们将不会被任何其他并发运行的事务修改。

    c=0
    Tx1 write locks c
    Tx1 reads c=0 
    Tx2 tries to write lock c, has to wait
    Tx1 writes c=1
    Tx1 commits (unlocks c)
    Tx2 write locks c (because it now can)
    Tx2 reads c=1 
    Tx2 writes c=2 
    Tx2 commits (unlocks c)
    

    希望能让事情更清楚。

    【讨论】:

    • 有谁知道如何进行写锁定? (在 Cypher 查询/Neography 中)
    • 恐怕目前还不能使用 Cypher 显式获取锁。做到这一点的唯一方法是核心 API (Java)。
    • 有点麻烦,但您可以使用 Cypher 显式获取节点或关系上的写锁。您可以通过在节点/关系上临时设置一次性属性来获取一个。然后,在查询结束之前,您可以删除该一次性属性。
    • @mirelon,Neo4j 的流行 APOC 插件有一系列可以通过 Cypher 调用的显式锁定程序,例如 call apoc.lock.nodes([nodes]) 在 neo4j-contrib.github.io/neo4j-apoc- 了解更多信息程序/#_locking
    猜你喜欢
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2010-10-25
    • 2014-12-20
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多