事务对neo4j数据库的意义是什么意思

voi*_*ila 5 transactions neo4j neo4jphp

我对期限交易有点困惑.假设在事务A中我们有两个命令C1和C2,并且在事务B中是相同的.现在两个事务同时进行,那么这些观察是否正确?

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

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

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

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

谢谢

Amit Aggarwal

Mic*_*man 8

我们需要谈谈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)
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

希望能让事情更加清晰.

  • 这有点麻烦,但您可以*使用Cypher明确获取节点或关系上的写锁定.您可以通过在节点/关系上临时设置一次性属性来获取一个.然后,在查询结束之前,您可以删除该一次性属性. (2认同)