Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Transactions 参考neo4j数据库,事务意味着什么_Transactions_Neo4j_Neo4jphp - Fatal编程技术网

Transactions 参考neo4j数据库,事务意味着什么

Transactions 参考neo4j数据库,事务意味着什么,transactions,neo4j,neo4jphp,Transactions,Neo4j,Neo4jphp,我对术语交易有点困惑。 假设在事务A中有两个命令C1和C2,并且在事务B中有相同的命令。 现在两项交易同时进行 这些观察结果正确吗 首先执行事务A C1和C2的所有命令(假设先输入),然后只执行事务B的命令 可以执行事务A或B的任何命令,但必须保证,如果任何事务的任何命令失败,则该事务将回滚 若第二种情况为true,则在事务中默认情况下,它不会锁定任何资源,直到其完成 若第一种情况为真,则默认情况下,事务将锁定资源,直到资源完成 谢谢 Amit Aggarwal我们需要谈谈ACID中的“I”(N

我对术语交易有点困惑。 假设在事务A中有两个命令C1和C2,并且在事务B中有相同的命令。 现在两项交易同时进行 这些观察结果正确吗

  • 首先执行事务A C1和C2的所有命令(假设先输入),然后只执行事务B的命令

  • 可以执行事务A或B的任何命令,但必须保证,如果任何事务的任何命令失败,则该事务将回滚

  • 若第二种情况为true,则在事务中默认情况下,它不会锁定任何资源,直到其完成

  • 若第一种情况为真,则默认情况下,事务将锁定资源,直到资源完成

  • 谢谢

    Amit Aggarwal

    我们需要谈谈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调用的显式锁定过程,例如
    调用APOC.lock.nodes([nodes])
    在Neo4j contrib.github.io/Neo4j APOC procedures/#锁定中了解更多信息