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